我有一个场景,可以根据键组比较两个词典。 即
TmpDict ={}
TmpDict2={}
for line in reader:
line = line.strip()
TmpArr=line.split('|')
TmpDict[TmpArr[2],TmpArr[3],TmpArr[11],TmpArr[12],TmpArr[13],TmpArr[14]]=line
for line in reader2:
line = line.strip()
TmpArr=line.split('|')
TmpDict2[TmpArr[2],TmpArr[3],TmpArr[11],TmpArr[12],TmpArr[13],TmpArr[14]]=line
这可以很好地比较具有完全相同键的两个词典但是有一个容差,我需要考虑。那就是.. TmpArr [12],TmpArr [14]是需要检查公差的时间和持续时间。请参阅以下示例
示例:
dict1={(111,12,23,12:22:30,12:23:34,64): 4|1994773966623|773966623|754146741|\N|359074037474030|413025600032728|}
dict2={(111,12,23,12:22:34,12:23:34,60) :4|1994773966623|773966623|754146741|\N|359074037474030|413025600032728|}
假设我有两个长度为1的词典,公差为“4”秒,因此即使4秒的时间和持续时间存在差异,上述键也必须被视为匹配行。 我知道字典搜索密钥是o(1)而不管长度如何,我怎样才能以相同的性能实现这种情况。 谢谢
答案 0 :(得分:1)
您至少有以下4个选项:
将所有键存储在容差范围内(消耗内存)。
查找带宽度的键。请注意,如果公差是定义的并且是常数,那么
查询为C * O(N)
,即O(n)
。
结合以前的方法:使用某种方案压缩密钥,比如向下舍入到可整除为4,最多可被4整除,然后将这些密钥的值存储在字典中,并从精确验证值是否正确。
或者不使用字典而是使用某种树形结构;请注意,您仍然可以将密钥的确切部分存储在字典中。
因此,您没有提供足够的信息来决定最好的信息。不过我个人会去3。
答案 1 :(得分:0)
如果您可以使用更多内存来保持上述代码的性能,则可以为每个元素插入多个条目。例如" 111,12,23,12:22:30,12:23:34,60"," 111,12,23,12:22:30,12:23:34 ,61"," ...," 111,12,23,12:22:30,12:23:34,68"只插入"" 111,12,23,12:22:30,12:23:34,64"键。 如果你不想浪费内存但o(1)保持性能,你可以检查一个键的8个键(4个键和4个键)。它比上面的代码多8倍,但也是o(1)。