이 대안은 다른 것보다 자세한 내용이지만 두 가지 요인에 따라 더 효율적일 수 있습니다 (맨 끝의 내 노트 참조). 많은 수의 구성 항목이있는 많은 수의 파일을 처리하는 경우가 아니라면 다른 제안을 통해이 파일을 사용하는 것을 고려하지 않겠지 만 성능이 문제인 경우이 알고리즘이 도움이 될 수 있습니다. 파일 세트 (c2f
를 호출하고, 파일에서. 모두 당신이 파일을 glob에로 구축 할 수 있습니다 설정 한 구성 문자열 (f2c
)까지로 구성 문자열에서 사전에
시작.
하는 것은 할 수 clear, c2f는 키가 문자열이고 값이 파일 집합 인 사전입니다 f2c는 키가 파일이고 값이 문자열 집합 인 사전입니다
f2c 및 하나의 파일 키를 반복합니다. 데이터 항목. 해당 항목이 들어있는 모든 파일을 찾으려면 c2f를 사용하십시오.이 파일 만 비교해야합니다.
# this structure simulates the files system and contents.
cfg_data = {
"config1.txt": ["1.1.1.1", "2.2.2.2"],
"config2.txt": ["1.1.1.1"],
"config3.txt": ["2.2.2.2", "1.1.1.1"],
"config4.txt": ["2.2.2.2"]
}
# Build the dictionaries (this is O(n) over the lines of configuration data)
f2c = dict()
c2f = dict()
for file, data in cfg_data.iteritems():
data_set = set()
for item in data:
data_set.add(item)
if not item in c2f:
c2f[item] = set()
c2f[item].add(file)
f2c[file] = data_set;
# build the results as a list of pairs of lists:
results = []
# track the processed files
processed = set()
for file, data in f2c.iteritems():
if file in processed:
continue
size = len(data)
equivalence_list = []
# get one item from data, preferably the one used by the smallest list of
# files.
item = None
item_files = 0
for i in data:
if item == None:
item = i
item_files = len(c2f[item])
elif len(c2f[i]) < item_files:
item = i
item_files = len(c2f[i])
# All files with the same data as f must have at least the first item of
# data, just look at those files.
for other_file in c2f[item]:
other_data = f2c[other_file]
if other_data == data:
equivalence_list.append(other_file)
# No need to visit these files again
processed.add(other_file)
results.append((data, equivalence_list))
# Display the results
for data, files in results:
print data, ':', files
계산 복잡도에 메모를 추가 : 여기
가 작동 코드의이 O N 파일의 개수 ((K 로그 N) * (L 로그 M)가) 기술적으로, M이다 (< = N)은
그룹의 수이고, 동일한 내용을 가진 파일의이고 L (< = M)은 각 L에 대해 쌍으로 비교해야하는 파일의 평균 수입니다 처리 된 파일. K < < N과 L < < M.
은 쇼 "나는, 루프 글로브 결과를 파일의 디렉토리 glob에 한 번에 각 파일을 열고 각 라인에 맞게 정규식을 사용하는 방법을 이해하는"경우에 효율적이어야한다 우리는 그 코드를 작성하고 나머지는 어떻게 처리하는지 보여 드리겠습니다. 힌트 : 사전을 사용하십시오. – agf