如何进行百万级字典搜索**(非英语)**

时间:2017-07-05 03:00:20

标签: c file dictionary search

有一个字典csv文件,百万级数据&不是英文(例如中文或日文),最大的词是 32bytes

每次我想在文件中搜索单词。

现在我的解决方案是阻止搜索

  1. 首先对数据进行排序
  2. 然后我将N个数据拆分为Sqrt(N)块,并使用 ftell in C 获取每个块中第一个数据的文件偏移量,然后将它们存储在索引文件以这种方式:( word),(dict中的偏移量)
  3. 每当我收到单词搜索请求时,我打开索引文件并逐行读取,直到我发现此单词在此块中,然后我使用 fseek重新定位到该块的dict文件中的第一个数据,然后逐行读取,直到我在dict中找到数据。
  4. 此解决方案是否合适或是否有任何改进空间? 或者还有其他解决方案吗?我不知道如何使用散列或树来搜索文件中的数据。我是否需要根据要求重拍它们? 感谢!!!!!

1 个答案:

答案 0 :(得分:0)

我首先想到的是,对于这种数据集大小,一百万不是一个大数字。使用基本平衡二进制搜索应该是log2(百万)比较,或每次搜索大约20比较。保持尽可能简单,我会将32字节键读入包含(键,文件偏移量)的结构数组中:

struct record {
  uint8_t key[32];
  uint8_t key_length;
  uint64_t file_offset;
};

#define MAX_RECORDS 1000000

struct record my_index[MAX_RECORDS];

然后确保'my_index'数组按键排序,这可以使用标准库qsort()函数(https://linux.die.net/man/3/qsort)完成。完成后,您可以按照此处列出的算法https://en.wikipedia.org/wiki/Binary_search_algorithm实施分而治之的二进制数组搜索...此算法由标准C库的bsearch()函数实现(https://linux.die.net/man/3/bsearch )。