比较来自世界各地的卖家的域名和 IT 服务价格

获得以下最小集合 Python


http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
是一种相当快的方法,可以为极限产生简单的数字
k

通过以下方式:

从一套开始
p = /2, 3, 4, ..., k/


i = 2

.

以。。。开始
i^2

, 删除所有倍数
i


p

.

重复下一个最小的
i


p

, 尽管
i >= sqrt/k/

.

我目前的实现看起来像这样。 /随着所有偶数的初步过滤的明显优化/:


# Compute all prime numbers less than k using the Sieve of Eratosthenes
def sieve/k/:
s = set/range/3, k, 2//
s.add/2/

for i in range/3, int/sqrt/k//, 2/:
if i in s:
for j in range/i ** 2, k, i * 2/:
s.discard/j/

return sorted/s/


EDIT:

这是基于的等效代码
list

:


def sieve_list/k/:
s = [True] * k
s[0] = s[1] = False
for i in range/4, k, 2/:
s[i] = False

for i in range/3, int/sqrt/k// + 2, 2/:
if s[i]:
for j in range/i ** 2, k, i * 2/:
s[j] = False

return [2] + [ i for i in range/3, k, 2/ if s[i] ]


它有效,但不太正确。 线:


for i in range/3, int/sqrt/k//, 2/:
if i in s:
[...]


找到以下最小的元素
s

, 检查每个奇数的拨号消息。 理想情况下,实施实际上应该是:


while i < sqrt/k/:
[...]
i = next smallest element in s


但是,从那以后
set

混乱,我不知道如何 /甚至是可能的/ 将下一个最小的元素获得更有效的方式。 我考虑了使用的可能性
list

带旗帜
True

/
False

对于素数,但你仍然要去
list

寻找下一个项目
True

. 您也不能只删除元素
list

, 由于它使得它无法在步骤中有效地消除成分数 2.

有没有办法更有效地找到下一个最小的元素? 如果没有,是否有一些其他数据结构允许您删除
O/1/

通过意义和有效的方法来找到下一个最小的元素?
已邀请:

喜特乐

赞同来自:

套件是混乱的,因为它们是内部实施的哈希套件。 没有有效的方法来找到这种数据结构中的最小元素;
min/s/

将是最卑鄙的方式 /但是这个 O/n//.

您可以使用
collections.deque


和...一起

你的集合。 采用
deque

以排序顺序存储项目列表。 每次需要收到最低限度时,请从中删除项目
deque

, 直到你找到你集中的那个。 这抑制了成本 O /1/ 全部取消输入数组 /当你只需要跳出来 n 时间/.

我还需要注意的是,没有数据结构 O/n/ 从列表中创建 /或者 O/1/ 插入/, O/1/ 按价值删除 O/1/ 最低搜索; 这种数据结构可用于琐碎的实现。 o/n/ 总体分类 /理论上信息/ 是不可能的。

哈希套件变得非常接近,但你必须牺牲有效的最低搜索。

诸葛浮云

赞同来自:

您可以使用列表而不是集合。 初始化列表未涵盖任何人。 作为一个数字,您可以使用元素索引。

初始化列表

开始S. p = 2

标记所有倍数
p

在S.列表中 'M' 对于标记

在列表中查找下一个未标记的项目,并使其新建
p

. 如果没有,那么你结束了。

如果您需要找到下一个未标记的索引,只需查看索引之后的项目
p

等于零。

要回复问题请先登录注册