python

来源:互联网 发布:vm虚拟机安装mac 编辑:程序博客网 时间:2024/05/22 06:55
问题:对字符列表进行组合输出输入:a,b,c,d输出:'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd'解决方案:采用递归:1'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd'2'b', 'bc', 'bcd', 'bd'3'c', 'cd'4'd'讨论:1、资源上存在浪费。在计算字符组合时,会重复计算相同的组合。将去重复放在字符组合处理过程中。2、字符串长度为25时,处理时间约2秒。长度为62时,处理时间2323.19秒:15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']['t', '8', 'R', '4', 'o', 'm', 'p', 'S', 'D', 'V', 'x', 'v', 'z', 's', 'P', 'H', 'N', 'u', 'C', '2', 'f', 'k', '9', 'U', 'L', 'i', 'l', 'A', 'O', 'W', 'c', '0', 'F', 'a', 'b', 'd', 'G', 'Q', 'r', '1', 'J', 'Y', 'h', '7', 'y', '3', 'B', 'E', 'K', 'T', 'q', '5', 'M', 'g', 'j', 'X', 'I', 'Z', 'w', '6', 'n', 'e']处理组合耗时 2323.19 秒597618源代码:
# -*- coding:utf-8 -*-'''对字符列表进行组合输出输入:a,b,c,d输出:'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd'采用递归:1'a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd'2'b', 'bc', 'bcd', 'bd'3'c', 'cd'4'd''''import stringimport randomimport timefrom datetime import datetime, timedeltadef str2list(str0):    '''字符串转列表,list0=list(str0)'''    passdef list2str(list1):    '''列表转为字符串,str0=''.join(list1)'''    str0 = ''    for i in list1:        str0 += str(i)    return str0def norepeat(list1):    '''去掉重复'''    list0 = []    list0.append(list1[0])    for i in list1:        if i not in list0:            list0.append(i)    return list0# result = [] #取消全局变量def list_handle(list1, result):    '''获取所有组合'''    length = len(list1)    # print 'list长度为%d\n' % length    if 1 == length:        result.append(str(list1[0]))    else:        # 第三次迭代,考虑abd场景        cnt = 1        while(1):            str0 = list2str(list1[0:cnt])            if str0 not in result:                result.append(str0)            for m in range(cnt, length, 1):                str1 = ''                while (length > m):                    str1 += str(list1[m])                    str_tmp = str0 + str1                    if str_tmp not in result:                        result.append(str_tmp)                    m += 1            # print 'cnt---', cnt            # print result            cnt += 1            if length == cnt:                break        list_handle(list1[1:length], result)        # 第二次迭代,考虑a,ab,abc,abcd的场景        # str0 = str(list1[0])        # result.append(str0)        # for m in range(1,length,1):        #     str1 = ''        #     while(length > m):        #         str1 += str(list1[m])        #         result.append(str0 + str1)        #         m += 1        #        # str0 = str(list1[0]) + str(list1[1])        # m = 3        # str1 = ''        # while(length > m):        #     str1 += str(list1[m])        #     result.append(str0 + str1)        #     m += 1        # m = 3        # str1 = ''        # while(length > m):        #     str1 += str(list1[m])        #     result.append(str0 + str1)        #     m += 1        # 第一次迭代,直观的写出输出的方式        # str1 = str(list1[1])        # result.append(str0 + str(list1[length-3]))        # str2 = str(list1[2])        # result.append(str0 + str(list1[length-2]))        # result.append(str0 + str(list1[length-3]) + str(list1[length-2]))        # str3 = str(list1[3])        # result.append(str0 + str(list1[length-1]))        # result.append(str0 + str(list1[length-3]) + str(list1[length-1]))        # result.append(str0 + str(list1[length-2]) + str(list1[length-1]))        # result.append(str0 + str(list1[length-3]) + str(list1[length-2]) + str(list1[length-1]))if __name__ == '__main__':    list_in = ['a','b','c','d']    result = []    list_handle(list_in, result)    print len(result),result    # print len(norepeat(result)), norepeat(result)    str0 = ''.join(random.sample(string.ascii_letters + string.digits, 25))    print list(str0)    result = []    begin_time = datetime.now()    list_handle(list(str0), result)    end_time = datetime.now()    delta_time = end_time - begin_time    print '处理组合耗时 %.2f ' % delta_time.total_seconds()    print len(result)    # begin_time = datetime.now()    # list_norepeat = norepeat(result)    # end_time = datetime.now()    # delta_time = end_time - begin_time    # print '去掉重复耗时 %.2f ' % delta_time.total_seconds()    # print len(list_norepeat)'''输出结果:---list长度为4cnt--- 1['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad']cnt--- 2['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd']cnt--- 3['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd']list长度为3cnt--- 1['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd']cnt--- 2['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd']list长度为2cnt--- 1['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd', 'c', 'cd']list长度为122 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'ab', 'abc', 'abcd', 'abd', 'abc', 'abcd', 'b', 'bc', 'bcd', 'bd', 'bc', 'bcd', 'c', 'cd', 'd']15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']''''''改进后:将去掉重复的处理放在字符组合过程中。15 ['a', 'ab', 'abc', 'abcd', 'ac', 'acd', 'ad', 'abd', 'b', 'bc', 'bcd', 'bd', 'c', 'cd', 'd']['U', 'T', 'd', 'i', '7', 'm', 'J', 'V', 'B', 'O', 'w', 'y', 'c', 'H', '2', 'h', 'o', 'S', '4', 't', 'K', 'Z', 'A', 'g', 'f']处理组合耗时 1.61 15275'''