使用PHP在二进制搜索中读入文本文件,而不使用ram内存

时间:2016-11-12 17:49:17

标签: php

我需要创建一个脚本,通过管道“|”读取文件分隔符使用二进制搜索而不使用内存RAM。我该怎么办?

我试过了:

$handle = fopen("myfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
       // while reads line make binary search
    }

    fclose($handle);
} else {
   // error opening the file.
} 

myfile.txt的

  Name|Title|Andrew|TheBook1|July|TheChest|Carol|OneTime

2 个答案:

答案 0 :(得分:1)

您可以使用stream_get_line将管道用作分隔符。

while (($name = stream_get_line($handle, 0, '|')) !== false) {
   // if ($name == 'Carol') { ...
}

答案 1 :(得分:1)

由于它的功课,我会给你一些提示/步骤,你会弄清楚如何实现它们:)

  1. 二进制搜索算法将搜索划分为块。在每一步中,它将包含该元素的块切成两半。这就是为什么最初它的速度非常快。
  2. 就此而言,您需要按字母顺序排序数据。练习说你必须在不使用内存的情况下实现二进制搜索。不能说您不能使用内存来订购数据。因此,通过" |"爆炸该字符串,按字母顺序排序并再次内爆。你有订购字符串。
  3. 对于实际算法,您无法使用内存,因此您只需使用文件系统。
  4. 您需要知道您在搜索中的区块在哪里开始和结束。
  5. 我不知道你是否被允许在内存中使用变量。如果没有,您也必须将变量写入文件。
  6. 在这种情况下,编写getBlockStart(),getBlockEnd(),setBlockStart,setBlockEnd()等函数来读取/写入文件中的值。
  7. 使用blockStart = <first element>, blockEnd = <lastELement>
  8. 启动算法
  9. 分为2部分,并根据字母顺序查看元素的哪个部分。
  10. 要查看第10个,只需阅读该文件的10个元素。这样你达到了它。
  11. 重复,直到找到您要查找的元素。