当前位置: 首页 > 知识库问答 >
问题:

itertools的计算复杂度是多少。python中的组合?

柯阳曦
2023-03-14

itertools。python中的combines是查找所有r项组合的强大工具,但是,我想知道它的计算复杂性。

假设我想知道n和r的复杂性,当然它会给出n个项列表中所有r项的组合。

根据官方文件,这是粗略的实施。

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

共有2个答案

蒋嘉实
2023-03-14

我也有同样的问题(对于itertools.permutations),很难追踪复杂性。这使我使用matplotlib将代码可视化。pyplot;

代码片段如下所示

result=[]
import matplotlib.pyplot as plt
import math
x=list(range(1,11))
def permutations(iterable, r=None): 
    count=0
    global result
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            count+=1
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            resulte.append(count)
            return
for j in x:
    for i in permutations(range(j)):
        continue

x=list(range(1,11))
plt.plot(x,result)

itertools的时间复杂度图。置换

从图中可以看出,时间复杂度为O(n!)其中n=输入大小

冯沛
2023-03-14

我会说它是θ[r(n选择r)],n选择r部分是生成器必须产生次数,也是外部的次数迭代。

在每次迭代中,至少需要生成长度为r的输出元组,这就给出了附加因子r。其他内部循环也将是每个外部迭代的O(r)

这是假设元组生成实际上是O(r),并且列表get/set确实是O(1),至少在给定算法中的特定访问模式的情况下是平均的。如果不是这样,那么仍然Ω[r(n选择r)]

像往常一样,在这种分析中,我假设所有整数运算都是O(1),即使它们的大小没有限制。

 类似资料:
  • 注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)

  • 问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。

  • 问题内容: 我在Java类中有一个私有的LinkedList,并且经常需要检索列表中的最后一个元素。列表需要缩放,所以我试图确定在进行更改时是否需要保留对最后一个元素的引用(以实现O(1)),或者LinkedList类是否已经通过getLast()调用完成了此操作。 LinkedList.getLast()的big-O成本 是多少 , 有记载吗? (即,我是否可以依靠此答案,或者即使它是O(1),

  • 我有一个算法可以检查是否可以解决游戏行。游戏行是一个正整数数组,其中最后一个元素为 0。游戏标记从索引 0 开始,沿着数组移动它所在的整数指示的步数。 例如,[1,1,0]返回true,而[1,2,0]返回false。标记也可以向左或向右移动以解决游戏。也就是说,[3,3,2,2,0]是可解的。 我尝试了一些游戏行示例,并计算了最坏情况下的时间复杂度: 其他情况下给我的数字,我找不到与输入大小的关

  • 问题内容: 我已经看到了此页面 https://wiki.python.org/moin/TimeComplexity, 但是我没有看到列表中的函数。什么是时间的时间复杂度的? 我对时间的实验表明,它适用于较大的尺寸。有人可以确认吗? timeit反转大小列表的时间 问题答案: 是的,您是对的,它是O(n),其中n- 列表长度。在此处查找更多信息:https : //www.ics.uci.edu

  • 我正在学习算法和数据结构课程。 今天,我的教授说下面算法的复杂度是2n。 我一直等到课程结束,走近他,告诉他我真的相信这是一个O(n)算法,我做了计算来证明它,并想给他们看,但他继续说它不是,没有给我任何令人信服的解释。 该算法是递归的,具有以下复杂性: 我计算它是一个,这样: 让我们展开 当T中的项为1时,我们停止,即: n/(2i)=1== 替换后,我们获得 由于该算法是从关于合并排序的课程中