''' Author: SJ2050 Date: 2021-10-10 23:34:50 LastEditTime: 2021-10-16 23:23:48 Version: v0.0.1 Description: Solution for homework 2. Copyright © 2021 SJ2050 ''' from itertools import permutations def combination(arr, n): if n == 0: return [[]] l =[] for i in range(0, len(arr)): m = arr[i] remLst = arr[i + 1:] for p in combination(remLst, n-1): l.append([m]+p) return l def heapPermutation(arr, n, process): if n == 1: process(arr) return for i in range(n): heapPermutation(arr, n-1, process) if n & 1: arr[0], arr[n-1] = arr[n-1], arr[0] else: arr[i], arr[n-1] = arr[n-1], arr[i] if __name__ == '__main__': nums = [1, 2, 3, 4] m = 3 count = 0 combs = combination(nums, m) def printAndCount(arr): global count count += 1 for i in range(len(arr)): print(f'{arr[i]}', end='') print('') print('3-digit nums:') for c in combs: heapPermutation(c, m, printAndCount) print('-'*12) print(f'Total count: {count}') # 从一列数中取出三个元素组成三位数的算法复杂度分析: # 首先是组合分析,从一列数中取出三个数的组合个数为n*(n-1)*(n-2)/6,算法时间复杂度为O(n^3). # 接着,对每队组合进行排列,排列算法选用的是heap算法,其时间复杂度为O(n!). # 故总的时间复杂度为: O((n^3)*(3!)) --> O(n^3)