获得以下最小集合 Python
筛
http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
是一种相当快的方法,可以为极限产生简单的数字
通过以下方式:
从一套开始
和
.
以。。。开始
, 删除所有倍数
的
.
重复下一个最小的
在
, 尽管
.
我目前的实现看起来像这样。 /随着所有偶数的初步过滤的明显优化/:
EDIT:
这是基于的等效代码
:
它有效,但不太正确。 线:
找到以下最小的元素
, 检查每个奇数的拨号消息。 理想情况下,实施实际上应该是:
但是,从那以后
混乱,我不知道如何 /甚至是可能的/ 将下一个最小的元素获得更有效的方式。 我考虑了使用的可能性
带旗帜
/
对于素数,但你仍然要去
寻找下一个项目
. 您也不能只删除元素
, 由于它使得它无法在步骤中有效地消除成分数 2.
有没有办法更有效地找到下一个最小的元素? 如果没有,是否有一些其他数据结构允许您删除
通过意义和有效的方法来找到下一个最小的元素?
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/
通过意义和有效的方法来找到下一个最小的元素?
没有找到相关结果
已邀请:
2 个回复
喜特乐
赞同来自:
将是最卑鄙的方式 /但是这个 O/n//.
您可以使用
和...一起
你的集合。 采用
以排序顺序存储项目列表。 每次需要收到最低限度时,请从中删除项目
, 直到你找到你集中的那个。 这抑制了成本 O /1/ 全部取消输入数组 /当你只需要跳出来 n 时间/.
我还需要注意的是,没有数据结构 O/n/ 从列表中创建 /或者 O/1/ 插入/, O/1/ 按价值删除 O/1/ 最低搜索; 这种数据结构可用于琐碎的实现。 o/n/ 总体分类 /理论上信息/ 是不可能的。
哈希套件变得非常接近,但你必须牺牲有效的最低搜索。
诸葛浮云
赞同来自:
初始化列表
开始S. p = 2
标记所有倍数
在S.列表中 'M' 对于标记
在列表中查找下一个未标记的项目,并使其新建
. 如果没有,那么你结束了。
如果您需要找到下一个未标记的索引,只需查看索引之后的项目
等于零。