【发布时间】:2017-07-05 03:00:19
【问题描述】:
有字典csv文件,百万级数据&非英文(如中文或日文),最大单词可达32bytes
每次我想在文件中搜索单词。
现在我的解决方案是阻止搜索:
- 先对数据进行排序
- 然后我将 N 个数据拆分为 Sqrt(N) 个块,并使用 ftell in C 获取每个块中第一个数据的 文件偏移量,然后将它们存储在一个以这种方式索引文件:(word),(dict中的偏移量)
- 每次收到单词搜索请求,我打开Index文件,逐行读取直到发现这个单词在这个Block中,然后我使用fseek重定位到 dict 文件中该块的第一个数据,然后逐行读取,直到我在 dict 中找到数据。
此解决方案是否合适或是否有任何改进空间? 或者有没有其他解决方案?我不知道如何使用哈希或树来搜索文件中的数据。我必须根据要求重新制作它们吗? 谢谢!!!!!!
【问题讨论】:
-
你的目标是什么?更快的搜索?内存少?你可能想看看tries。
-
@TheGreatContini 对中文来说太大了吗? unicode的汉字超过20000个,emm ms级别的搜索和内存占用尽量小?
-
@ENEKaIku 在大多数现代环境中,一百万个 32 字节的字是微不足道的。正如 TheGreatContini 所问的,您想要实现什么目标?您需要对简单的搜索数据结构进行一些研究。通过散列边缘标签,很容易为任意大的字母表构建一个 trie。使用以这种方式构建的 trie,查找包含 N 个字符的单词需要与 N 成比例的时间,并且常数因子非常小。字典的大小无关紧要。如果你不喜欢尝试,那么简单的哈希表和二叉搜索树都会比你的算法做得更好。
-
你的方法一点也不差。我的第一个想法是使用一个简单的数组,其元素数等于您使用的语言中的字符数(我不知道有多少是中文或日文的)。对于每个元素,您可以存储开始的偏移量。例如,您可以通过减去
array[x+1] - array[x]中的偏移量来知道每个块的大小。然后,您可以使用单词中的第一个字符来识别块并将其读入内存以进行搜索(您可以将free延迟到下一次搜索并检查以重用当前块)。 -
@Gene 谢谢!但是如何存储 trie 或哈希表呢?是不是和块搜索一样,我得把文件偏移量作为“指针”存入另一个文件?
标签: c file dictionary search