相关疑难解决方法(0)

生成给定字符串的所有排列

找到字符串的所有排列的优雅方法是什么.是的ba,会是baab,但是怎么样abcdefgh?是否有任何Java实现示例?

java algorithm

404
推荐指数
13
解决办法
54万
查看次数

JavaScript中的排列?

我正在尝试编写一个执行以下操作的函数:

  • 将整数数组作为参数(例如[1,2,3,4])
  • 创建一个包含[1,2,3,4]所有可能排列的数组,每个排列的长度为4

下面的函数(我在网上找到)通过将一个字符串作为参数,然后返回该字符串的所有排列来完成此操作

我无法弄清楚如何修改它以使其与整数数组一起使用(我认为这与某些方法在字符串上的工作方式不同于它们在整数上的工作方式有关,但我不确定. ..)

var permArr = [], usedChars = [];
function permute(input) {
  var i, ch, chars = input.split("");
  for (i = 0; i < chars.length; i++) {
    ch = chars.splice(i, 1);
    usedChars.push(ch);
    if (chars.length == 0)
      permArr[permArr.length] = usedChars.join("");
    permute(chars.join(""));
    chars.splice(i, 0, ch);
    usedChars.pop();
  }
  return permArr
};
Run Code Online (Sandbox Code Playgroud)

注意:我希望使函数返回整数数组,而不是字符串数组.

我真的需要使用JavaScript的解决方案.我已经在python中找到了如何做到这一点

javascript permutation

127
推荐指数
14
解决办法
11万
查看次数

快速置换 - >数字 - >置换映射算法

我有n个元素.为了举个例子,让我们说,7个元素,1234567.我知道有7个!=这些7个元素可能有5040个排列.

我想要一个包含两个函数的快速算法:

f(number)将0到5039之间的数字映射到唯一的排列,并且

f'(置换)将置换映射回其生成的数字.

我不关心数字和排列之间的对应关系,只要每个排列都有自己唯一的数字.

所以,举个例子,我可能会在哪里有功能

f(0) = '1234567'
f'('1234567') = 0
Run Code Online (Sandbox Code Playgroud)

想到的最快的算法是枚举所有排列并在两个方向上创建查找表,这样,一旦创建表,f(0)将是O(1)并且f('1234567')将是查找字符串.然而,这是内存饥饿,特别是当n变大时.

任何人都可以提出另一种算法,它可以快速工作,没有内存缺点吗?

algorithm math permutation combinatorics

108
推荐指数
5
解决办法
4万
查看次数

生成集合的排列(最有效)

我想生成一个集合(集合)的所有排列,如下所示:

Collection: 1, 2, 3
Permutations: {1, 2, 3}
              {1, 3, 2}
              {2, 1, 3}
              {2, 3, 1}
              {3, 1, 2}
              {3, 2, 1}
Run Code Online (Sandbox Code Playgroud)

一般而言,这不是"如何"的问题,而是关于如何最有效的问题.此外,我不想生成所有排列并返回它们,但一次只生成一个排列,并且只在必要时继续(很像迭代器 - 我也尝试过,但结果却少了有效).

我已经测试了很多算法和方法,并提出了这个代码,这是我尝试过的最有效的代码:

public static bool NextPermutation<T>(T[] elements) where T : IComparable<T>
{
    // More efficient to have a variable instead of accessing a property
    var count = elements.Length;

    // Indicates whether this is the last lexicographic permutation
    var done = true;

    // Go through the array from last to first
    for (var i = …
Run Code Online (Sandbox Code Playgroud)

c# algorithm optimization performance permutation

59
推荐指数
5
解决办法
5万
查看次数

没有递归的置换算法?Java的

我想得到一个数字的所有组合,没有任何重复.如0.1.2,0.2.1,1.2.0,1.0.2,2.0.1,2.1.0.我试图找到一个简单的方案,但不能.我为它绘制了一个图形/树,这尖叫使用递归.但是如果可能的话,我想在没有递归的情况下这样做.

有人可以帮我这么做吗?

java recursion permutation sequence

37
推荐指数
6
解决办法
4万
查看次数

查找数组中所有项目组合的最佳方法是什么?

在c#中查找数组中所有项目组合的最佳方法是什么?

c# algorithm

36
推荐指数
4
解决办法
4万
查看次数

值列表的所有可能组合

我的C#程序中有一个整数列表.但是,我只在运行时知道列表中的项目数.

让我们说,为了简单起见,我的列表是{1,2,3}现在我需要生成所有可能的组合,如下所示.{1,2,3} {1,2} {1,3} {2,3} {1} {2} {3}

有人可以帮忙吗?

c# combinations

32
推荐指数
6
解决办法
7万
查看次数

Linq ToList/ToArray/ToDictionary表现

好吧,我遇到很多情况,IEnumerable是不够的.但是我不确定上述方法调用的性能.

我真正想问的是:

是ToList/ToArray的性能:

  1. 一个O(n)操作,它将IEnumerable复制到一个新的数组/列表?
  2. 如果我在列表上调用linq扩展方法,如果我调用ToList则它具有O(1)性能,如果调用ToArray则具有O(n)(如果我的原始列表是数组则相反)?

  3. 一些魔法发生了,性能是O(1)?

字典可能是O(n),对吧?

.net c# linq performance

20
推荐指数
1
解决办法
1万
查看次数

生成字符串列表的所有组合

我想生成一个字符串列表的所有可能组合的列表(它实际上是一个对象列表,但为了简单起见,我们将使用字符串).我需要这个列表,以便我可以在单元测试中测试每个可能的组合.

例如,如果我有一个列表:

  var allValues = new List<string>() { "A1", "A2", "A3", "B1", "B2", "C1" }
Run Code Online (Sandbox Code Playgroud)

我需要一个List<List<string>>所有组合,如:

  A1
  A2
  A3
  B1
  B2
  C1
  A1 A2
  A1 A2 A3
  A1 A2 A3 B1
  A1 A2 A3 B1 B2
  A1 A2 A3 B1 B2 C1
  A1 A3
  A1 A3 B1
  etc...
Run Code Online (Sandbox Code Playgroud)

递归函数可能是获得所有组合的方法,但它似乎比我想象的更难.

有什么指针吗?

谢谢.

编辑:两个解决方案,有或没有递归:

public class CombinationGenerator<T>
{
    public IEnumerable<List<T>> ProduceWithRecursion(List<T> allValues) 
    {
        for (var i = 0; i < (1 << allValues.Count); i++)
        {
            yield return ConstructSetFromBits(i).Select(n => allValues[n]).ToList(); …
Run Code Online (Sandbox Code Playgroud)

c# math combinations

16
推荐指数
1
解决办法
2万
查看次数

如何获得所有可能的3个字母排列?

可能重复:
列出字符串/整数的所有排列

例如,

aaa .. aaz .. aba .. abz .. aca .. acz .. azz .. baa .. baz .. bba .. bbz .. zzz
Run Code Online (Sandbox Code Playgroud)

基本上,想象计算二进制,但不是从0到1,它从a到z.

我一直试图让这个工作几个小时现在无济于事,公式变得非常复杂,我不确定是否有更简单的方法来做到这一点.

谢谢阅读.

编辑:我现在有这样的东西,但它不是那里,我不确定是否有更好的方法:

private IEnumerable<string> GetWordsOfLength(int length)
{
    char letterA = 'a', letterZ = 'z';

    StringBuilder currentLetters = new StringBuilder(new string(letterA, length));
    StringBuilder endingLetters = new StringBuilder(new string(letterZ, length));

    int currentIndex = length - 1;

    while (currentLetters.ToString() != endingLetters.ToString())
    {
        yield return currentLetters.ToString();

        for (int i = length - 1; i > 0; …
Run Code Online (Sandbox Code Playgroud)

c# algorithm alphabetical

10
推荐指数
3
解决办法
2万
查看次数