我有一组 6 000个数据包,为了进行比较,我将其表示为字符串(前28个字节),以便与同样多的数据包进行比较,我也是表示为28个字节的字符串。
我必须将一组中的每个数据包与所有其他数据包相匹配。 匹配始终唯一。
我发现比较字符串需要一些时间。有没有办法加快这个过程?
EDIT1:我不想排列字符串元素,因为我总是确保数据包列表和相应字符串列表之间的排序被保留。
EDIT2:这是我的实施:
list1, list2 # list of packets (no duplicates present in each list!)
listOfStrings1, listOfStrings2 # corresponding list of strings. Ordering is preserved.
alreadyMatchedlist2Indices = []
for list1Index in xrange(len(listOfStrings1)):
stringToMatch = listOfStrings1[list1Index]
matchinglist2Indices = [i for i, list2Str in enumerate(listOfStrings2)
if list2Str == stringToMatch and i not in alreadyMatchedlist2Indices]
if not matchinglist2Indices:
tmpUnmatched.append(list1Index)
elif len(matchinglist2Indices) == 1:
tmpMatched.append([list1Index, matchinglist2Indices[0]])
alreadyMatchedlist2Indices.append(matchinglist2Indices[0])
else:
list2Index = matchinglist2Indices[0] #taking first matching element anyway
tmpMatched.append([list1Index, list2Index])
alreadyMatchedlist2Indices.append(list2Index)
答案 0 :(得分:5)
---在这里,我假设你逐个接受每一个字符串并与其他字符串进行比较.---
我建议对字符串列表进行排序并比较相邻的字符串。这个运行时应该是O(nlogn)。
答案 1 :(得分:4)
这是一个简单的线性时间方法 - 至少如果我正确理解你的问题:
>>> def get_matches(a, b):
... reverse_map = {x:i for i, x in enumerate(b)}
... return [(i, reverse_map[x]) for i, x in enumerate(a) if x in reverse_map]
...
>>> get_matches(['a', 'b', 'c'], ['c', 'd', 'e'])
[(2, 0)]
这接受两个字符串序列a
和b
,并将表示为索引元组的匹配列表返回到a
和b
。这是O(n + m),其中m和n是a
和b
的长度。
答案 2 :(得分:0)
出了什么问题:
matches = [packet for packet in list1 if packet in list2]