处理将唯一字保存到文件的有效算法

时间:2012-04-10 12:14:35

标签: php file unique

我目前所做的是,从URL解析文本,然后清理文本并用空格将它们分解并保存到文件中。

我觉得很难,

仅保存唯一文件,以便抓取多个网址:

案例:从site.com/page1中删除单词并将唯一的单词保存到文件中。在抓取site.com/page2时,我需要检查每个单词是否已经存在于文件中,只有在不存在时才保存。

我的想法是,取$ word [0],从文件中找出每一行,如果找不到则检查并保存。但那将是千万次迭代。

我不是在寻找任何代码,只是想知道如何有效和快速地处理它。

5 个答案:

答案 0 :(得分:2)

我假设你已经在一个名为site1.txt的文件中存储了你从site1获得的唯一单词,并且你已经在一个名为$site2的数组中从site2中删除了单词,现在你已经' d喜欢在$site2文件中逐行存储site2.txt,只存储唯一字词:

$wordsInFile1 = file('site1.txt');
$wordsInFile1 = array_flip($wordsInFile1);

foreach($site2 as $i => $word) {
    if(isset($wordsInFile1[$word])) {
       unset($site2[$i]);
    }
}

// now $site2 contains unique words from site2 and words that are not in site1.txt

答案 1 :(得分:1)

据我所知,您当前的算法位于复杂性类O(n^2)中。你为每个单词再次遍历列表,这不是那么好,对。我建议您先将所有单词写入文件,然后使用有效的算法对列表进行排序。完成后,您可以删除重复项。例如,在linux下,您可以使用此命令:

sort -u unsortedList > sortedAndCleanedList

答案 2 :(得分:1)

grep <word> file应该能够很快地运作

或者,您可以创建一个名为md5的单词的空文件,然后在将该单词添加到主文件之前检查md5(word)文件是否存在。请注意,某些文件系统不允许在目录中包含超过32767个文件(因此您可能需要根据md5哈希的前几个字符创建子目录)

答案 3 :(得分:1)

您可以通过内存表示高效快速地处理它,允许快速搜索,如哈希表。

假设你有一个函数可以返回文件中的所有单词,规范化,不是标点符号,没有空格:

$words = extract_words('Hello my dear!');

where {as $words导致:

array(
    'hello' => 1,
    'my'    => 1,
    'dear'  => 1,
);

您可以使用var_export

将此哈希表快速存储到文件中
$file = 'words1.txt';
file_put_contents(sprintf('return %s;', var_export($words, TRUE)));

使用include

阅读
$words = include($file);

要检查该hashmap是否包含该单词,请使用isset

$exist = isset($words[$word]);

正如你在这里有数组,你可以跨文件合并它们,差异等等.- PHP有许多基于数组的函数可用。如果你想用PHP做这件事,我觉得这很快。

如果您有更大的列表,我建议您使用用于几千兆字节的单词列表的工具,通常为written in C

答案 4 :(得分:0)

您可以对文件进行排序,然后搜索单词。

想法是保持文件排序,然后使用任何搜索算法以相同的模式查找文件中的现有条目。如果找不到现有条目,请插入新条目。

保持文件排序的成本需要硬盘操作。