如何找到给定长度的k的排列?
例如:
这个单词cat有3个字母:如何找到单词2的所有排列cat。结果应该是:ac,at,ca,ac,等...
这不是作业问题。可以使用任何语言,但更可取的是:C / C ++或C#。我知道如何为长度LENGTH创建递归,但不为自定义大小创建递归。
说我有一组数字:
Group1 = 10, Group2 = 15, Group3 = 20, Group4 = 30
Run Code Online (Sandbox Code Playgroud)
我想输出所有数字子集的总和
10 + 15 = 25
10 + 15 + 20 = 45
10 + 15 + 20 + 30 = 75
15 + 20 = 35
15 + 20 + 30 = 65
20 + 30 = 50
10 + 20 = 30
10 + 30 = 40
10 + 20 + 30 = 60
... (assumed the rest is typed out)
Run Code Online (Sandbox Code Playgroud)
这些组中的每一个都有一个名称,所以我想在结果之前打印出计算中使用的名称:
Group1 + Group2 …Run Code Online (Sandbox Code Playgroud) 可能重复:
生成任意字母到任意长度的所有组合
我试图在php中写出10个字母(zzzzzzzzzz)中所有可能的单词.我怎样才能做到这一点?它看起来像这样:http://i.imgur.com/sgUnL.png
我尝试了一些方法,但它们只是随机制作10个字母而不是从1个字母增加.顺便说一下执行时间以及它的大小并不是问题.我只需要算法,如果有人用代码显示它,当然会更有帮助..
给定一串长度为'n'的字符串.如何获得长度为r的所有子序列(r <= n).我正在考虑使用动态编程来实现它,但无法提出一个好的解决方案.我想要一个伪代码.
例如.给定字符串"abc"并且r = 2.
输出:ab ba ac ca bc cb
提前致谢
我需要一个与python相同的功能itertools.combinations(iterable, r)
到目前为止,我想出了这个:
{-| forward application -}
x -: f = f x
infixl 0 -:
{-| combinations 2 "ABCD" = ["AB","AC","AD","BC","BD","CD"] -}
combinations :: Ord a => Int -> [a] -> [[a]]
combinations k l = (sequence . replicate k) l -: map sort -: sort -: nub
-: filter (\l -> (length . nub) l == length l)
Run Code Online (Sandbox Code Playgroud)
有更优雅和有效的解决方案吗?
在为编程竞赛(如 ACM、Code Jam 等)练习时,我遇到了一些问题,需要我生成一些向量元素的所有可能组合。
假设我有向量 {1,2,3},我需要生成以下组合(顺序不重要):
1
2
3
1 2
1 3
2 3
1 2 3
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经使用以下代码完成了它:
void getCombinations(int a)
{
printCombination();
for(int j=a;j<vec.size();j++)
{
combination.pb(vec.at(j));
getCombinations(j+1);
combination.pop_back();
}
}
Run Code Online (Sandbox Code Playgroud)
调用 getCombinations(0); 为我做这项工作。但是有更好(更快)的方法吗?我最近听说了位掩码。据我所知,它只是针对 1 到 2^N-1 之间的所有数字,我将该数字转换为二进制,其中 1 和 0 表示该元素是否包含在组合中。
我如何有效地实现这一点?如果我把每个数字都按照标准的方式(一直除以 2)变成二进制,然后检查所有的数字,似乎浪费了很多时间。有没有更快的方法?我是否应该继续使用递归(除非我遇到一些递归无法完成工作的大数字(堆栈限制))?
我正在尝试实现一种算法,从一组 n 个元素中获取 k 个元素的所有组合,其中两个连续组合之间的差异最大化(类似于反向格雷码)。换句话说,应该对组合进行排序以避免元素连续出现两次,这样就不会不必要地歧视任何元素。
理想情况下,该算法也不会预先计算所有组合并将它们存储到内存中,而是按需提供组合。我对此进行了广泛的搜索,并找到了一些详细的答案,例如/sf/answers/8949951/,但我似乎无法应用它。此外,该答案中链接的许多文章都是付费内容。
为了说明我的意思:
从一组 [0, 1, 2, 3, 4] 中,找到两个元素的所有组合。使用一个简单的算法,尝试增加最右边的元素,直到不再可能,然后向左移动,增加前一个数字等,我得到以下结果:
[0, 1]
[0, 2]
[0, 3]
[0, 4]
[1, 2]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 4]
Run Code Online (Sandbox Code Playgroud)
我使用以下 Java 代码生成此结果:
public class CombinationGenerator {
private final int mNrElements;
private final int[] mCurrentCombination;
public CombinationGenerator(int n, int k) {
mNrElements = n;
mCurrentCombination = new int[k];
initElements(0, 0);
// fake initial state in order not to miss first combination below
mCurrentCombination[mCurrentCombination.length - …Run Code Online (Sandbox Code Playgroud) 我有一个由 n 个整数组成的数组(不一定是不同的!),我想遍历所有大小为 k 的子集。但是我想排除所有重复的子集。
例如
array = {1,2,2,3,3,3,3}, n = 7, k = 2
Run Code Online (Sandbox Code Playgroud)
那么我想要迭代的子集(每次一次)是:
{1,2},{1,3},{2,2},{2,3},{3,3}
Run Code Online (Sandbox Code Playgroud)
这样做的有效算法是什么?递归方法是最有效/最优雅的吗?
如果您有特定于语言的答案,我将使用 C++。
如此给出input = [1, 2, 3],k=2这将返回:
1 2
1 3
2 1
2 3
3 1
3 2
Run Code Online (Sandbox Code Playgroud)
这是最接近我正在寻找的,但不完全是:http://algorithms.tutorialhorizon.com/print-all-combinations-of-subset-of-size-k-from-given-array/
1 2
1 3
2 1
2 3
3 1
3 2
Run Code Online (Sandbox Code Playgroud)
^ 缺少结果,例如2 1、3 1、3 2等。
其次,我不确定我是否正确命名了这个问题,因为“大小 k 的子集的所有组合”的解决方案没有给出预期的答案。
我正在寻找一种范围视图的实现,它可以懒惰地创建给定范围的 k 个组合。
例如,{1, 2, 3}具有 2 个组合的范围应返回:
std::vector v {1,2,3};
auto rng = ranges::views::combinations<2>(v);
for(auto[a,b] : rng)
std::cout << a << ' ' << b << '\n';
// 1, 2
// 1, 3
// 2, 3
Run Code Online (Sandbox Code Playgroud)
非常类似于 Pythonsitertools.combinations()模块。
我从这个问题中找到了实现。但它们不是针对范围的,也不是懒惰的。
由于这个问题的答案,我目前的解决方案:
std::vector v {1,2,3};
auto rng = ranges::views::combinations<2>(v);
for(auto[a,b] : rng)
std::cout << a << ' ' << b << '\n';
// 1, 2
// 1, 3
// 2, 3
Run Code Online (Sandbox Code Playgroud)