php 关于两个文件中字符串对比 获取相同部分的方法

谢邀1. array_unique()、str_split() 这种东西平时写业务时用用就好了,处理大一点的数据、算法就别用,一是很浪费性能,二者你不知道后面它到底做了什么,用了什么数据结构。2. 大的文件不能一次读取到内存里,所以肯定不能用 file_get_contents() ,得用 fread() 这样的,一次读一点数据3. 说到文件和字符串,那么有一个概念很重要就是编码,按照不同的编码去读文件结果是不一样的。file_get_contents() 这个函数讨厌就讨厌在这里,读出来是字符串,raw string,还不能设置读取编码,这还不如读一个 buffer 出来呢。4. 题目应该说明,输入文件的编码格式是什么,BOM 需不需要处理,特殊字符如何处理,尤其是文本文件末尾最后一个 newline。5. 既然题目没说,那么我们可以按照 Web 界最通用的 UTF8 编码(无BOM),所有字符都考虑在内。以上为前提。第一步,查得 unicode 最大 code point 为 0x10FFFF ,一百多万,还可以接受,用 bit array 吧。第二步,找一个合适的数据结构。PHP 里没有 bit array 啊,让我们痛苦地扭动一下自己的身躯,想想别的办法。那我们用 byte array 吧,浪费一点可以把 byte 当 bit 用,也就一百多万byte,1MB 多一个数据结构,可以接受;节约一点可以自己换算 index 和 bitwise operation,140KB 不到,完美。什么? byte array 也没有?算了咱们走,用 js 。第三步,写代码代码如下,运行环境为 Node.js,为简化代码让别人能看懂,省略了 fs 模块引入,省略了 readable 事件处理,用比较简单的 Uint8Array 代替 Buffer ,并且没有 byte -\u0026gt; bit 换算过程。let maxCodePoint = 0x10FFFFlet readStreamA = fs.createReadStream(\u0026#39;a.txt\u0026#39;, { encoding: \u0026#39;utf8\u0026#39; })let arrA = new Uint8Array( maxCodePoint +1 )// 这里应该处理 readable 事件while(true){ let str = readStreamA.read() if( str === null ){ break; } for(let i=str.length-1;i\u0026gt;-1;--i){ let charCode = str.charCodeAt(i); // 这里用 char code 是不对的, 应该用code point 并且处理 surrogate pairs arrA = 1; }}let readStreamB = fs.createReadStream(\u0026#39;b.txt\u0026#39;, { encoding: \u0026#39;utf8\u0026#39; })let arrB = new Uint8Array( maxCodePoint +1 )// 这里应该处理 readable 事件while(true){ let str = readStreamB.read() if( str === null ){ break; } let l = str.length; for(let i=str.length-1;i\u0026gt;-1;--i){ let charCode = str.charCodeAt(i); // 这里用 char code 是不对的, 应该用code point 并且处理 surrogate pairs arrB = 1; }}let writeStreamC = fs.createWriteStream(\u0026#39;c.txt\u0026#39;, { encoding: \u0026#39;utf8\u0026#39; })for(let i=0;i\u0026lt;=maxCodePoint;++i){ if(arrA === 1 \u0026amp;\u0026amp; arrB === 1){ writeStreamC.write(String.fromCharCode(i)) }}// done很菜,大家轻喷。
■网友
感觉题主想要的算法应该是diff算法,就像是git diff中用与比较先后两个文件的改动的算法给你两个参考吧diff utilityDynamic Programming Tutorial
■网友
获取a.txt 和 b.txt中相同的字符存入c.txt主要在于 如何定义 相同字符是什么……比如 ABCAD 和 ADABC 存入c.txt 的是什么? ABCD吗?如果是这样,那还是挺简单的……


    推荐阅读