📜  制作所有大小为k的组合(1)

📅  最后修改于: 2023-12-03 15:07:16.813000             🧑  作者: Mango

制作所有大小为k的组合

本文介绍如何制作所有大小为k的组合。在计算机科学中,组合是指从给定的n个元素中选取k个元素的方式。制作所有大小为k的组合是解决组合问题的重要步骤,其应用包括数据挖掘、人工智能等领域。

问题描述

给定一个含有n个元素的集合S和一个正整数k,编写一个程序,返回所有大小为k的组合。

解决方法
方法一:递归算法

递归算法是制作组合的一种常用方法。具体步骤如下:

1.选取一个起始点i,循环从i到n,对于每个元素,将其加入当前的组合中。

2.如果当前组合大小为k,将其加入结果中,然后返回上一层递归。

3.如果当前组合大小小于k,对于当前元素的下一个元素,执行步骤1-2。

4.返回上一层递归,从上一层递归的下一个元素开始执行步骤1-3。

def combination(nums, k):
    res = []
    n = len(nums)
    
    def helper(temp, start):
        if len(temp) == k:
            res.append(temp[:])
            return
        for i in range(start, n):
            temp.append(nums[i])
            helper(temp, i+1)
            temp.pop()
            
    helper([], 0)
    return res
方法二:迭代算法

除递归算法外,还可以使用迭代算法来制作所有大小为k的组合。具体步骤如下:

1.初始化一个长度为k的数组comb用来存储当前的组合。将集合S的前k个元素加入comb中。

2.当comb的最后一个元素等于S的最后一个元素时,弹出comb的最后一个元素。

3.将comb的最后一个元素替换成前一个元素的后一个元素,让它向后移动一个位置。

4.添加一个新的元素到comb中。如果comb的长度等于k,将其加入结果中。

5.返回第2步,直到comb的第一个元素等于S的第一个元素。

def combination(nums, k):
    res = []
    n = len(nums)
    if n < k: return res
    
    comb = [i for i in range(k)]
    while True:
        temp = [nums[i] for i in comb]
        res.append(temp)
        
        i = k-1
        while i >= 0:
            if comb[i] != n-k+i:
                comb[i] += 1
                for j in range(i+1, k):
                    comb[j] = comb[j-1] + 1
                break
            i -= 1
        else:
            break
    
    return res
总结

本文介绍了两种方法来制作所有大小为k的组合。递归算法和迭代算法各有优缺点,具体应根据实际情况选择。