2016-11-12 48 views
0

我需要制作脚本来通过管道读取文件分隔符“|”与二进制搜索没有使用内存内存。我该怎么做?在使用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 
+0

用发生器读取('yield'),参见[here](http://php.net/manual/en/language.generators.overview.php)。良率线具有较低的内存占用量。 – Xorifelse

+0

@Xorifelse,'yield'在这里很有用吗?在每次迭代中'$ line'都被覆盖。 –

+0

你是什么意思的二进制搜索。你在寻找什么。你是在行内读取还是在整个文件中搜索? – RiggsFolly

回答

1

自功课,我会给你一些提示/步骤,你找出如何实现它们:)

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

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

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

但我仍然需要使用二进制搜索算法 –