python - O(logN) 中的排序列表计数元素

标签 python python-3.x algorithm count time-complexity

假设我有一个排序列表/数组 我需要在 O(logN) 次重复中计算该列表/数组中不同数字的数量 我已经知道我需要使用某种二进制算法,但在最坏的情况下我无法在 O(logN) 次重复中做到这一点 有什么想法吗?

最佳答案

使用bisect模块。

import bisect as b


arr = [1, 1, 1, 2, 2, 3, 3, 3, 3]
for x in [1, 2, 3, 0]:
    print(b.bisect_right(arr, x) - b.bisect_left(arr, x))

输出:

3
2
4
0

因此,该算法适用于您传递给它的任何值。如果传递的值不在列表中,则返回 0。


bisect 模块通过使用二分搜索来查找插入给定元素的适当位置。 bisect_left 给出最左边的索引,bisect_right 给出任何现有值右侧的索引。 通过将两者相减,我们得到列表中已存在的 x 值的数量。

由于bisect模块使用二分查找,所以该方法的复杂度为O(log N)。

关于python - O(logN) 中的排序列表计数元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52886949/

相关文章:

python - 带有颜色条的 Seaborn 图,以 0 为中心

python - Tensorboard 找不到 .runfiles 目录错误

python - 如何修复: "TypeError: ' bool' object is not subscriptable"

java - 深度优先搜索 - 2D 游戏 map

algorithm - 需要某种稳定的匹配算法

python - 在 Python 中生成所有大小为 k 的子集(包含 k 个元素)

python - 如何将数字四舍五入到最接近的 1000?

Python类: How to check whether an attribute is defined inside __init__ or outside __init__

Python 单元测试模块抛出 "ModuleNotFoundError: No module named ' tests.test_file'"

c# - 猴子可以走 2 步或 3 步 - 有多少种不同的方法可以到达顶峰?