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吗?如果是这样,那还是挺简单的……
推荐阅读
- 出入口■注意了!南京地铁两个出入口将临时封闭
- 过节■江苏省委省政府办公厅下发关于做好2021年元旦春节期间有关工作的通知
- 有必要重新开个C店吗
- 耻骨|韧带痛、耻骨也痛,从来没有这么痛过,痛了两个多星期了!”厦门孕妈崩溃:“孕晚期各种不舒服
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 雨下|全球关于禁售燃油车只是理论上可行吗
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 智叔|很多家长还在整箱买:谈谈关于牛奶的17个真相警惕这些列入黑名单的“假牛奶”
- 关于微信小程序的思考:运营者该何去何从
- 关于人工智能虚拟人的一些问题