繁体   English   中英

大型可排序数据结构? 字典还是其他?

[英]Large sortable data structures? Dictionary or something else?

我有一个大的python字典(65535键:值对),其中键是范围(0,65536),值是整数。

我发现排序这个数据结构的解决方案在这里发布: 按值排序Python字典

该解决方案有效,但不一定非常快。

使问题进一步复杂化的是,我有很多(数千个)这些字典,在排序之前必须将它们组合在一起。 我目前正在通过迭代一个字典中的对,在另一个字典中进行键查找,以及根据需要添加/更新条目来组合这些字典。

这使我的问题折叠起来:

1)字典是否是这个问题的正确数据结构? 自定义树或其他东西会更有意义吗?

2)如果词典是聪明的,合理的选择,那么结合词典的多个然后对它进行排序的理想方法是什么?

一个解决方案可能是我重新设计我的程序流程,以减少维护到一个字典的数量,虽然这是最后的手段。

谢谢

字典中填充了65535个条目,键的范围为(0:65536),听起来像数组。 如果您需要排序数组,为什么使用字典?

通常,在Python中,您将使用此类数据的列表。 在您的情况下,由于值是整数,您可能还需要考虑使用数组模块。 您还应该查看heapq模块,因为如果您的数据可以用这种方式表示,那么可以使用内置的合并函数。

在任何情况下,如果您需要合并数据结构并生成排序数据结构,最好使用合并算法,其中一种可能性是mergesort算法。

这里没有足够的信息说明你应该使用哪种数据结构,因为我们不知道你还在用它做什么。

如果您需要能够一次一个地将记录快速插入到数据结构中,那么您确实需要一个树状数据结构,遗憾的是,它没有标准实现(甚至是标准接口,对于某些操作)在Python中。

如果您只需要能够执行您所说的内容 - 对现有数据进行排序 - 那么您可以使用列表。 排序很快,特别是如果部分数据已经排序,您可以使用二进制搜索进行快速查找。 但是,插入元素将是O(n)而不是您将使用树获得的O(log n)。

这是一个简单的示例,将dicts转换为列表或元组,对组合结果进行排序,并使用bisect模块搜索项目。

请注意,您可以拥有重复的密钥,显示在多个dict中。 这很容易处理:它们将自然地排序在一起,并且二等分将为您提供一个包含所有这些键的[start,end)范围。

如果您想稍后添加数据块,请将其追加到最后并重新排序列表; Python的排序很擅长,它可能比O(n log n)好得多。

正如您所说,此代码假设您的密钥是整数。

dataA = { 1: 'data1', 3: 'data3', 5: 'data5', 2: 'data2' }
dataB = { 2: 'more data2', 4: 'data4', 6: 'data6' }

combined_list = dataA.items() + dataB.items()
combined_list.sort()
print combined_list

import bisect
def get_range(data, value):
    lower_bound = bisect.bisect_left(data, (value, ))
    upper_bound = bisect.bisect_left(data, (value+1, ))
    return lower_bound, upper_bound

lower_bound, upper_bound = get_range(combined_list, 2)
print lower_bound, upper_bound
print combined_list[lower_bound:upper_bound]

有了这么多的数据,我会咬紧牙关并使用内置的sqlite模块。 是的,你放弃了一些python的灵活性,必须使用SQL,但现在它的排序65k值; 接下来它将找到符合特定标准的值。 因此,与其重新发明关系数据库,不如现在就走SQL路线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM