【问题标题】:Binary Search for a line in a text file using Javascript使用 Javascript 对文本文件中的行进行二进制搜索
【发布时间】:2009-02-13 01:02:16
【问题描述】:

有没有办法在 Javascript 中对文本文件中的特定键进行基于磁盘的二进制搜索?文本文件太大而无法加载到内存中,但按键值排序。特别是,我正在寻找一种在 Javascript 中模仿 Perl 的 Search::Dict 功能的方法。

例如如果我有一个文件 foo.txt:

a 1
b 10
c 5
z 4

look(c,foo.txt) 应该通过执行二进制搜索而不是线性遍历文件来返回“c 5”行。

【问题讨论】:

  • 呃,你是怎么把文件内容转成javascript的?
  • 如何用javascript访问文件?
  • 我不确定。也许,这也是解决方案的一部分。
  • JS 不仅限于沙盒浏览器,它现在是 Java 的一部分(或即将成为)并在其他地方使用。我至少知道一个地方(可能还有其他地方),您可以使用它来不受惩罚地进行文件 I/O,作为 BIRT 报告生成器的脚本语言(那里调试 JS 的最佳方式)。

标签: javascript file-io binary-search


【解决方案1】:

我不知道 Javascript,但是如果你可以进行随机搜索,你可以通过搜索到当前块的中点(以字节为单位)进行二进制搜索,然后继续前进,直到你消耗了一个换行符,只要您“知道”您的密钥是针对换行符的。

不过,在某些情况下,您需要后退,因此您可以在了解文件缓冲的情况下进行搜索,这样后退的成本不会很高。

如果您不处理 ASCII 文件,我想这可能会有点麻烦。

【讨论】:

    【解决方案2】:

    并非如此,只有当您能够识别记录开始时,二进制搜索才真正可行。你似乎有可变长度的记录,所以除非你创建一个行起始偏移量数组,否则它不会起作用。

    正如 Nikhil 在评论中正确指出的那样,一种方法是根据文件大小对文件进行二进制分割,然后从那里找到最近的行。这仍然是相对有效的(即,比顺序搜索好得多)。

    【讨论】:

    • Perl 的 Search::Dict 做到了:perldoc.perl.org/Search/Dict.html。我不确定它在内部是如何工作的,但可能你可以根据字节“跳转”,然后找到最近的换行符进行比较。
    • 您可以跳到文件的中间,但这不一定是中间行。例如,如果前一百万行是 100 个字节,最后一百万行是 2 个字节。它不是相当二进制,但仍然比顺序搜索好。
    • 它应该仍然适合二进制搜索的时间限制。
    猜你喜欢
    • 2012-04-18
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2011-07-10
    • 1970-01-01
    • 2013-09-29
    • 2017-06-13
    相关资源
    最近更新 更多