stringtable.cpp
上传用户:panfucai
上传日期:2022-05-28
资源大小:4678k
文件大小:6k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. // 
  2. # define MAXSTRINGCOUNT 1000000
  3. # include "stringtable.h"
  4. CRITICAL_SECTION csModifyStrTable;
  5. void InitStringTable(PSTRTABLE &pTable)
  6. {
  7. pTable = new STRTABLE[MAXSTRINGCOUNT];
  8. pTable->iLen = 0;
  9. pTable->iCount = 0;
  10. pTable->iSequenceCount = 0;
  11. pTable->pWord = NULL;
  12. pTable->pFileList = NULL;
  13. pTable->iOccuredFiles = 0;
  14. pTable->iOccuredTimes = 0;
  15. }
  16. void AppendChar(PSTRTABLE pTable, TCHAR wchar)
  17. {
  18. EnterCriticalSection(&csModifyStrTable);
  19. long iPos = pTable->iCount + 1;
  20. (pTable + iPos)->pWord = new TCHAR[2];
  21. *((pTable + iPos)->pWord) = wchar;
  22. *((pTable + iPos)->pWord + 1) = 0;
  23. (pTable + iPos)->iLen = 1;
  24. (pTable + iPos)->pFileList = NULL;
  25. (pTable + iPos)->iOccuredFiles = 0;
  26. (pTable + iPos)->iOccuredTimes = 0;
  27. pTable->iCount ++;
  28. LeaveCriticalSection(&csModifyStrTable);
  29. }
  30. void AppendString(PSTRTABLE pTable, TCHAR wstr[])
  31. {
  32. EnterCriticalSection(&csModifyStrTable);
  33. long iPos = pTable->iCount + 1;
  34. (pTable + iPos)->pWord = new TCHAR[wcslen(wstr) + 2];
  35. wcscpy((pTable + iPos)->pWord, wstr);
  36. (pTable + iPos)->iLen = wcslen(wstr);
  37. (pTable + iPos)->pFileList = NULL;
  38. (pTable + iPos)->iOccuredFiles = 0;
  39. (pTable + iPos)->iOccuredTimes = 0;
  40. pTable->iCount ++;
  41. LeaveCriticalSection(&csModifyStrTable);
  42. }
  43. void ConstructStringTable(PSTRTABLE &pTable, PDICTABLE pDic)
  44. {
  45. InitStringTable(pTable);
  46. // Single characters and Words
  47. TCHAR charLastInitial = 0x4e00;
  48. for(long i = 1; i <= pDic->iCount; i++)
  49. {
  50. while(charLastInitial <= *((pDic + i)->pWord))
  51. {
  52. AppendChar(pTable, charLastInitial);
  53. charLastInitial++;
  54. }
  55. AppendString(pTable, (pDic + i)->pWord);
  56. }
  57. while(charLastInitial <= 0x9FA5)
  58. {
  59. AppendChar(pTable, charLastInitial);
  60. charLastInitial++;
  61. }
  62. pTable->iSequenceCount = pTable->iCount;
  63. }
  64. PSTRTABLE LookUpInSortedStringTable(PSTRTABLE pTable, int iLeft, int iRight, TCHAR wstr[])
  65. {
  66. if(iLeft > iRight)
  67. {
  68. return NULL;
  69. }
  70. int iMid = (iLeft + iRight) / 2;
  71. int iResult = wcsncmp(wstr, (pTable + iMid)->pWord, (pTable + iMid)->iCount);
  72. if(iResult > 0)
  73. {
  74. if(iLeft == iRight)
  75. {
  76. return NULL;
  77. }
  78. else
  79. {
  80. return LookUpInSortedStringTable(pTable, iMid + 1, iRight, wstr);
  81. }
  82. }
  83. else if(iResult < 0)
  84. {
  85. if(iLeft == iRight)
  86. {
  87. return NULL;
  88. }
  89. else
  90. {
  91. return LookUpInSortedStringTable(pTable, iLeft, iMid - 1, wstr);
  92. }
  93. }
  94. else
  95. {
  96. return pTable + iMid;
  97. }
  98. }
  99. PSTRTABLE LookUpInUnsortedStringTable(PSTRTABLE pTable, TCHAR wstr[])
  100. {
  101. long iPos = pTable->iSequenceCount + 1;
  102. int iResult = 0;
  103. while(iPos <= pTable->iCount)
  104. {
  105. iResult = wcsncmp(wstr, (pTable + iPos)->pWord, (pTable + iPos)->iCount);
  106. if(iResult == 0)
  107. {
  108. return pTable + iPos;
  109. }
  110. iPos++;
  111. }
  112. return NULL;
  113. }
  114. PSTRTABLE LookUpInStringTable(PSTRTABLE pTable, TCHAR wstr[])
  115. {
  116. PSTRTABLE pResult = NULL;
  117. pResult = LookUpInSortedStringTable(pTable, 1, pTable->iSequenceCount, wstr);
  118. if(pResult != NULL)
  119. {
  120. return pResult;
  121. }
  122. else
  123. {
  124. pResult = LookUpInUnsortedStringTable(pTable, wstr);
  125. }
  126. return pResult;
  127. }
  128. PFILELIST TraverseFileList(PSTRTABLE pTable, int iDocID)
  129. {
  130. PFILELIST pFileList = pTable->pFileList;
  131. while(pFileList != NULL)
  132. {
  133. if(pFileList->iDocID == iDocID)
  134. {
  135. return pFileList;
  136. }
  137. pFileList = pFileList->pNext;
  138. }
  139. return NULL;
  140. }
  141. void AppendFileList(PSTRTABLE pTable, int iDocID)
  142. {
  143. PFILELIST pFileList = NULL;
  144. pFileList = TraverseFileList(pTable, iDocID);
  145. if(pFileList != NULL)
  146. {
  147. // Add count
  148. pFileList->iTimes ++;
  149. pTable->iOccuredTimes ++;
  150. }
  151. else
  152. {
  153. // Append a new object
  154. pFileList = new FILELIST;
  155. pFileList->iDocID = iDocID;
  156. pFileList->iTimes = 1;
  157. pFileList->pNext = NULL;
  158. if(pTable->pFileList == NULL)
  159. {
  160. pTable->pFileList = pFileList;
  161. }
  162. else
  163. {
  164. PFILELIST pTail = pTable->pFileList;
  165. while(pTail->pNext != NULL)
  166. {
  167. pTail = pTail->pNext;
  168. }
  169. pTail->pNext = pFileList;
  170. }
  171. pTable->iOccuredTimes ++;
  172. pTable->iOccuredFiles ++;
  173. }
  174. }
  175. void SortFileListByTimes(PFILELIST pFileList)
  176. {
  177. PFILELIST pCurrMax = NULL, p = NULL;
  178. p = pFileList->pNext;
  179. if(p == NULL)
  180. {
  181. return;
  182. }
  183. pCurrMax = p;
  184. while(p != NULL)
  185. {
  186. if(p->iTimes > pCurrMax->iTimes)
  187. {
  188. pCurrMax = p;
  189. }
  190. p = p->pNext;
  191. }
  192. // Put the maximum to the front
  193. if(!(pFileList->pNext == pCurrMax))
  194. {
  195. PFILELIST pFront = pFileList;
  196. while(pFront->pNext != NULL)
  197. {
  198. if(pFront->pNext == pCurrMax)
  199. {
  200. break;
  201. }
  202. pFront = pFront->pNext;
  203. }
  204. pFront->pNext = pCurrMax->pNext;
  205. pCurrMax->pNext = pFileList->pNext;
  206. pFileList->pNext = pCurrMax;
  207. }
  208. SortFileListByTimes(pCurrMax);
  209. }
  210. void SortFileListByTimes(PSTRTABLE pTable)
  211. {
  212. PFILELIST pCurrMax = NULL, p = NULL;
  213. p = pTable->pFileList;
  214. pCurrMax = p;
  215. while(p != NULL)
  216. {
  217. if(p->iTimes > pCurrMax->iTimes)
  218. {
  219. pCurrMax = p;
  220. }
  221. p = p->pNext;
  222. }
  223. // Put the maximum to the front
  224. if(pTable->pFileList != pCurrMax)
  225. {
  226. PFILELIST pFront = pTable->pFileList;
  227. while(pFront->pNext != NULL)
  228. {
  229. if(pFront->pNext == pCurrMax)
  230. {
  231. break;
  232. }
  233. pFront = pFront->pNext;
  234. }
  235. pFront->pNext = pCurrMax->pNext;
  236. pCurrMax->pNext = pTable->pFileList;
  237. pTable->pFileList = pCurrMax;
  238. }
  239. SortFileListByTimes(pCurrMax);
  240. }
  241. void FillStringTable(PSTRTABLE pTable, int iDocID, PWORDLIST pWordList)
  242. {
  243. PSTRTABLE pTarget = NULL;
  244. PWORDLIST pWord = pWordList->pNext;
  245. while(pWord != NULL)
  246. {
  247. pTarget = LookUpInStringTable(pTable, pWord->pWord);
  248. if(pTarget != NULL)
  249. {
  250. AppendFileList(pTarget, iDocID);
  251. pWord = pWord->pNext;
  252. }
  253. else
  254. {
  255. AppendString(pTable, pWord->pWord);
  256. }
  257. }
  258. }