需要算法和实现帮助 - 比较2个文件

时间:2012-10-14 09:56:37

标签: php algorithm implementation

我的项目目的:有4个文件。每个都有不同的行数。每行包含一个或几个单词。现在,对于这些文件中的每一个,我想要计算哪个其他文件具有最大的常用词。

  • 例如。 (','是新行\ n)
  • 输入
  • 文件1行:A,B,C,D
  • 文件2行:C,D,E,F
  • 文件3行:A,E,C,G
  • 文件4行:C,E,F,A

  • 输出:

  • 文件1:最大常用字为2,它们位于文件中:文件2(C,D),文件3(A,C)和文件4(C,A)。
  • 文件2:最大常用字数为3,它们位于文件中:文件4(C,E,F)。
  • 文件3:最大常用字数为3,它们位于文件中:文件4(C,E,A)。
  • 文件4:最大常用字数为3,它们位于文件中:文件2(C,E,F)。

我的逻辑:

  1. 开始
  2. 从文件中读取每一行并将其作为一维数组存储在内存中(例如,array1 [0] =“A”,array1 [1] =“B”等等。
  3. 由于有4个文件,我创建4个数组= array1到array4。他们每个人都将拥有相应文件的内容。
  4. 现在我将比较第一个数组中的第一个单词和第二个数组中的第一个单词。
  5. 现在我将比较第一个数组中的第一个单词和第二个数组中的第二个单词,依此类推,直到第二个数组结束。
  6. 我会继续这个,直到最后一个数组中的最后一个字。
  7. 当我发现某些东西匹配时,我会通过递增1来记录变量。
  8. 希望知道这是否是解决此问题的权利。

    或者有更好的方法来思考这个问题吗?

    编辑: 1.忘了添加,将使用php。

3 个答案:

答案 0 :(得分:2)

我从像这样的有趣情况中学习了PHP。继续学习。

// put all files in same directory as this script
// put file names in this array
$files = array('1.txt','2.txt','3.txt','4.txt');
$words = array();
$data = '';

$delimiter = "\n";  // change this to \r if running windows OS
// itterate through the files and create a word list  
foreach($files as $file){
    $fh = fopen($file,'r');
    $data .= $delimiter.fread($fh,filesize($file));
    fclose($fh);
}
// assuming 1 match per line like your question example 
$lines = explode($delimiter,$data);

foreach($lines as $line){
    $line = trim($line);
    if(empty($line)) continue;
    @$words[$line] += 1;  // @ suppreses notices
}

var_dump($words);
/* *
 * according to your example:
 *
array(7) {
  ["A"]=>
  int(3)
  ["B"]=>
  int(1)
  ["C"]=>
  int(4)
  ["D"]=>
  int(2)
  ["E"]=>
  int(3)
  ["F"]=>
  int(2)
  ["G"]=>
  int(1)
} 
*/

答案 1 :(得分:1)

应该可以使用array_intersect轻松完成。

答案 2 :(得分:1)

您应该首先对数组进行排序。然后,要计算array1array2之间的公共线数,请设置两个计数器i1i2

伪代码:

while(i1 < array.length && i2 < array2.length)
  if array1[i1] == array2[i2]
    ++i1; ++i2
    ++result
  else if array1[i1] < array2[i2]
    ++i1
  else
    ++i2