快速成员名单
回答
想法
您可以创建一个dict
。每个元素都存储它发生的排序位置列表。
为了回答查询:二进制搜索第一个元素大于或等于a
,检查它是否存在,并小于b
伪
预处理:
from collections import defaultdict
byvalue = defaultdict(list)
for i, x in enumerate(data):
byvalue[x].append(i)
查询:
def has_index_in_slice(indices, a, b):
r = bisect.bisect_left(indices, a)
return r < len(indices) and indices[r] < b
def check(byvalue, x, a, b):
indices = byvalue.get(x, None)
if not indices: return False
return has_index_in_slice(indices, a, b)
复杂性是O(log N)
如果我们假设list
和dict
具有O(1)“通过索引获取”的复杂性,那么每个查询在这里。
['bisect'](http://docs.python.org/2/library/bisect.html)模块提供了简化二进制搜索代码并使其更快的工具。 – user2357112
@ user2357112谢谢,补充。 – RiaD
我编辑了你的答案,删除了注释掉的代码,并且只做了一次而不是两次搜索键“x”。我进一步作出了美学改变,使答案更加pythonic(没有分号,没有'!','defaultdict'而不是手动检查,'枚举(数据)'而不是'range(len(data))'。) – orlp
是的,你可以预处理这些切片成组,从而使会员查找O(1)
代替O(n)
:
check = set(data[a:b])
if x in check:
# do something
if y in check:
# do something else
列入名单的数据库,并采取内置的索引,优化和缓存的优势。例如,来自PostgreSQL手册:
索引一旦被创建,则不需要进一步的干预:当表被修改的 系统将更新索引,并且它将 在查询中使用时,它的索引认为这样做会比顺序表扫描更有效率。
但是你也可以使用sqlite来简化(和Python的标准库中的可用性)。从Python's documentation, regarding indexing:
行实例充当连接 对象的高度优化的row_factory。它试图模仿大部分功能中的元组。
它支持按列名称和索引,迭代, 表示,相等性测试和len()进行映射访问。
该网页上的其他地方:
行同时提供了基于索引的和不区分大小写的基于域名的访问 对列,几乎没有内存开销。它可能比你自己的基于自定义字典的方法更好,或者甚至是基于db_row的 解决方案。
- 1. 快速搜索CRM 4.0中的市场营销名单成员
- 2. 结构成员的快速注释
- 3. JQuery快速转储对象的成员
- 4. 嵌套列表中快译通:访问字典的名单内成员名单
- 5. Facebook智能名单成员
- 6. 快速自动完成下拉菜单
- 7. 快速简单和快速修复/快速引擎
- 8. 其成员的名字加入名单
- 9. 快速查看Visual Studio 2008中类的成员列表? C#
- 10. 类型''中没有成员''的值快速
- 11. 快速删除多个类成员(正则表达式?visual studio?)
- 12. 快速随机生成器
- 13. 快速函数完成
- 14. 快速大矩阵生成
- 15. TypeScript类成员速记bug?
- 16. css编码员快速指南
- 17. 获取ejabberd MUC成员名单
- 18. 给出成员名单的选择ID
- 19. 如何获取群组成员名单
- 20. 总结名单成员一步一步
- 21. 蟒蛇:快速修复两个列表名单成一个列表
- 22. 快速表单验证
- 23. 快速表单提交
- 24. 快速添加单针MKMapView?
- 25. 快速单表数据库
- 26. 并行快速排序由单线程快速排序
- 27. 无效的匿名类型成员声明。匿名类型的成员必须有一个成员赋值,简单名称或成员访问
- 28. LINQ:无效的匿名类型成员声明。匿名类型的成员必须有一个成员赋值,简单名称或成员访问来声明
- 29. (Android Studio)在外部类中快速完成变量名建议?
- 30. 快速blox公司 - 签名生成问题
您可能需要添加更多关于'x','a'和'b'如何变化的信息。许多不同的'x's针对'[a:b]'或者'x'的一个实例,针对许多不同的'[a:b]'切片进行检查...?另外,数据是否可以分类? –
我可以为每个a,b对有许多不同的x。列表数据并未被排序。 – phoenix