寻找重复文件(文件夹和文件名不同文件内容相同)
https://leetcode.com/problems/find-duplicate-file-in-system/description/
思路比较简单,以文件内容为key建立map,将相同内容的文件地址放在一起
public static List<List<String>> findDuplicate(String[] paths) {
List<List<String>> ans=new LinkedList<List<String>>();
HashMap<String,LinkedList<String>> map=new HashMap<String,LinkedList<String>>();
for(int i=0;i<paths.length;i++)
{
String[] files=paths[i].split(" ");//按空格切分,数组第一个值是文件夹名,后面是文本文件名及其内容
String directory=files[0];
for(int k=1;k<files.length-1;k++)
{
String[] fc=files[k].split("\\(");
if(map.containsKey(fc[1]))
{
map.get(fc[1]).add(directory+"/"+fc[0]);
}
else
{
LinkedList<String> tmp=new LinkedList<String>();
tmp.add(directory+"/"+fc[0]);
map.put(fc[1],tmp);
}
}
}
for(String key:map.keySet())
ans.add(map.get(key));
return ans;
}
但是题干中给了更进一步的思考:
- Imagine you are given a real file system, how will you search files? DFS or BFS?
- If the file content is very large (GB level), how will you modify your solution?
- If you can only read the file by 1kb each time, how will you modify your solution?
- What is the time complexity of your modified solution? What is the most time-consuming part and memory consuming part of it? How to optimize?
- How to make sure the duplicated files you find are not false positive?
1.在真实系统中搜索文件下的文件并读取经常采用DFS
2.当文件内容很大时,上述解法就无能为力了,这里可以先基于文件大小进行hash(大的文件通常有元数据,可以比较它们元数据的不同);如果文件大小一样,可以通过文件内容的逐字节比较。
3.逐字节比较也可以
4.O(M*N):M表示文件个数,N表示文件内容长度
5.false positive指被误认为内容重复的非重复文件,只要经过文件大小、文件元数据、文件内容(逐字节比较)这三重比较就能避免。