2014-10-08 42 views
0

我有一个场景可以根据密钥集来比较两个字典。 即Python比较具有相似和精确密钥的字典

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 

这工作得很好用完全一样的按键比较两个库,但有一个宽容,我需要consider.That是.. TmpArr [12],TmpArr [14]是时间和时长需要宽容是checked.Please见下面的例子

实施例:

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'seconds因此上述密钥必须被认为是匹配的线连虽然有差异时间和持续时间为4秒。 我知道字典搜索的关键是o(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)。

+0

嗨@abilinx谢谢你的答案。我试过这个,但它不是o(1)...并且你能回答我这个问题....什么是性能散列python字典中的键值,因为现在在这种情况下我们有8 * linenumcount。 – 2014-10-10 11:36:49

+0

我确定Python中的字典是一种散列表。散列函数总是以o(1)运行。从哈希表中检索值,如果我们有一个比数据大的哈希表,也是o(1)。因此,如果订单对您很重要,我建议您使用推荐的解决方案之一。但是,在实际情况下,整体表现比纯粹订单更重要。 – 2014-10-11 09:17:09

1

您至少有这4个选项:在公差范围内

  1. 存储的所有密钥(消耗内存)。

  2. 容忍地查找关键字。注意,如果公差被定义并且是恒定的,那么 查找是C * O(N),它是O(n)

  3. 结合了以前的方法:使用某种方案压缩密钥,比如舍入到可以被4整除,最多可以被4整除,然后将这些密钥的值存储在字典中,并从确切值如果它是正确的。

  4. 或者不使用字典,而改为某种树形结构;请注意,您仍然可以将密钥的确切部分存储在字典中。

因此,您没有提供足够的信息来决定哪些是最好的。但我个人会去3.

+0

嗨@Antti哈帕拉感谢您的答案,我通过添加键和值容忍两个词典检查,但实际上它需要很长时间。假设对于文件中的一行,如果容忍度为4,则会保存9个字典键值。我认为长度不会是一个限制,但会产生影响.BTW密钥的压缩能够在多大程度上提高性能。? – 2014-10-10 11:32:23