python - 组合算法分析

本文探讨了Python中实现组合算法的效率问题,通过对比不同的实现方式,包括修改后的全组合算法和itertools库的使用,分析了各种方法的运行时间和效果。作者提到,全组合的优化版本在小规模数据下表现良好,但随着元素数量增加,效率下降,而itertools库的组合功能在运行速度上表现出色。作者计划进一步研究如何在需要单个组合的情况下优化算法。
摘要由CSDN通过智能技术生成
def 组合(l,n):
    if len(l)==n:
        return [l]
    if n==1:
        z=[]
        for i in l:
            z.append([i])
        return z
    else:
        z=[]
        for i in range(len(l)):
            for j in 组合(l[i+1:],n-1):
                z.append([l[i]]+j)
        return z

暂时不去修改了,期间有个参数错误,大致是一次写成,虽然觉得可能有些不妥,但是和前辈的代码飙了下,效率还是不错的。

1、因为约数的算法中,有用质数拼约数的需求,需要用到组合功能
2、我的第一期尝试是昨晚,思维有点乱,也察觉到不对劲,但是我就是喜欢随意走走的那种,所以照着错的思维写了下,虽然结果是预料中的,但是还是忍不住先搜索了下大佬们怎么写的
python 实现组合以及全组合
从作者中得到了for i in range(len(l))这个思路,也是我察觉不对劲的地方
从评论中获得了[[]]的思路,虽然在我和作者都用字母为例下,用不到,但是我想了想,其实这个很棒的样子,因为一层层后,最基本的元素就是最基本的元素,而如果某环境下需要的元素是个多字符的,就乱了。

def combination_k(s, k):
    '''
    字符串 s 中选取 k(0 <= k <= len(s)) 个元素,进行组合,以列表的形式返回所有可能的组合
    s --> 输入的字符串
    k --> 选取的元素的个数
    
    测试结果如下:
    combination_k('abc', 2) >>> ['ab', 'ac', 'bc']
    
    combination_k('c', 2)   >>> []
        combination_k('c', 2) 的递归内部解释如下:
            --> combination_k('c', 2)
                --> for i in combination_k('', 1):
                        c + i
                    # 由于 combination_k('', 1) 的返回结果是一个空列表,这 for 循环遍历不会被执行,所以返回初始设定的值 []
    '''
    # recursive basis
    if k == 0: return ['']
    # recursive chain
    subletters = []
    # 此处涉及到一个 python 遍历循环的特点:当遍历的对象为空(列表,字符串...)时,循环不会被执行,range(0) 也是一样
    for i in range(len(s)):
        for letter in combination_k(s[i+1:], k-1):
            subletters += [s[i] + letter]
    return subletters

3、评论中的代码,得到的结果是列表的索引,看着有点乱,用着也需要再调用列表。。。咳咳!效率是杠杠的!功能是获取所有组合,看似功能不合要求,但是这耗时相当的短。看来我需要再好好的参照下!4个元素下,3.03 µs ± 88.5 ns,飞起,但是26个元素下,不知道卡在哪里了,不停,不出结果,停止才看到他是一直在运行,直到我强行停止

之后要参照评论中的代码研究一番!

def ZuHeIndex(li):
    reli = []
    for i in range(0, len(li)):
        if 0 == i:
            reli.append([i])
        else:
            addli = []
            addli.append([i])
            for ii in reli:
                addli.append(ii+[i])
            reli += addli
    return reli

研究结果,这个很6,毫不拖泥带水,但是这段代码的结果是全部组合,如果需要单一组合的话,需要改一下

这个是我昨晚的莽撞版,当初只是想动手实现下,毕竟空想就像是空转,一旦思维打结,就会更乱,于是写,虽然写的察觉到不对劲,但是很好奇这样会怎样!

def 组合(l,n):
    if n==1:
        z=[]
        for i in l:
            z.append(i)
        return z
    else:
        z=[]
        for i in l:
            lt=l.copy()
            lt.remove(i)
            z1=组合(lt,n-1)
            for j in z1:
                z.append(i+j)
        return z

真对全获取算法的修改,改成单获取

def ZuHeIndex(li):
    reli = []
    for i in range(0, len(li)):
        if 0 == i:
            reli.append([i])
        else:
            addli = []
            addli.append([i])
            for ii in reli:
                addli.append(ii+[i])
            reli += addli
    return reli
l=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

z=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值