标签: permutation

将采用数字或单词并找到所有可能组合的算法

我正在寻找一种算法,它将采用数字或单词并找到它们的所有可能变体,并让我定义要一起查找的值.

示例假设字符串或数组是:

cat  
dog  
fish  
Run Code Online (Sandbox Code Playgroud)

那么值为2的结果可能是:

cat dog  
cat fish  
dog cat  
dog fish  
fish cat  
fish dog   
Run Code Online (Sandbox Code Playgroud)

因此,3个项目的结果是6个可能的变化,2个结果匹配
3个结果匹配它将是:

cat dog fish  
cat fish dog  
dog cat fish  
dog fish cat  
fish cat dog  
fish dog cat  
Run Code Online (Sandbox Code Playgroud)

...甚至可能有更多的选择

我在这个例子的Stackoverflow上找到了一个链接来做这个,但它是在javascript中,我想知道是否有人知道如何在PHP中执行此操作可能已经构建了一些东西?

http://www.merriampark.com/comb.htm(死链接)

php algorithm permutation

15
推荐指数
2
解决办法
5617
查看次数

随机列表,确保没有项目保持在同一位置

我想要洗牌一系列独特的项目,但不要做一个完全随机的洗牌.我需要确保混洗列表中的元素与原始列表中的位置不同.因此,如果原始列表是(A,B,C,D,E),这个结果就可以了:(C,D,B,E,A),但这个不会:( C,E,A, D,B)因为"D"仍然是第四项.该列表最多包含七个项目.极端效率不是一个考虑因素.我认为这对Fisher/Yates的修改可以解决问题,但我不能用数学方法证明:

function shuffle(data) {
    for (var i = 0; i < data.length - 1; i++) {
        var j = i + 1 + Math.floor(Math.random() * (data.length - i - 1));

        var temp = data[j];
        data[j] = data[i];
        data[i] = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

random algorithm shuffle permutation combinatorics

15
推荐指数
2
解决办法
4254
查看次数

计算F#中的排列

受这个问题答案的启发,如何在F#中创建通用排列算法?谷歌没有给出任何有用的答案.

编辑:我在下面提供了我最好的答案,但我怀疑Tomas的更好(当然更短!)

algorithm f# permutation

14
推荐指数
2
解决办法
5394
查看次数

使用bash生成排列

是否有可能编写一个bash脚本,可以从文件中读取每一行并为每个行生成排列(不重复)?使用awk/perl很好.

File
----
ab
abc


Output
------
ab
ba
abc
acb
bac
bca
cab
cba
Run Code Online (Sandbox Code Playgroud)

bash shell permutation

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

找到方链排列的算法

如果连续数的总和始终是完美的平方,则排列是方形链.例如,

8 1 15 10 6 3 13 12 4 5 11 14 2 7 9 16

是数字1到16的平方链排列.我想编写一个程序来找到数字1到n的方形链式排列,n从1到100.

最简单的做法是按字典顺序排列n的所有排列(我知道如何写这个)并检查方形链条件,但这需要很长时间才能达到n大.

一个稍微好一点的方法是一次一个地选择我的排列中的数字,检查以确保我刚刚选择的数字在添加到前一个数字时形成一个正方形,并希望我将其设置到最后.不过,我不得不备份很多,而且我觉得它不会很有效率.

有没有更好的办法?另外,这是一个众所周知的问题吗?谢谢你的帮助.

algorithm permutation

14
推荐指数
1
解决办法
740
查看次数

如果给出N个项目列表,如何生成长度为LEN的排列?

注意:我正在使用python工作.

例如,给出一个列表:

list = ['a','b','c','d','e','f','g','h','i','j']
Run Code Online (Sandbox Code Playgroud)

我想生成一个包含所有可能的3项组合的列表列表:

['a','b','c'],
['a','b','d'],
['a','b','e']
Run Code Online (Sandbox Code Playgroud)

排列不应在排列中使用相同的项目两次,但顺序很重要并且表示应包括的不同排列,例如,

['a','b','c'],
['a','c','b']
Run Code Online (Sandbox Code Playgroud)

两者都应该包括在内.

"3"是我想要生成的排列的神奇长度,但我不会小看任意长度排列的解决方案.

谢谢你的帮助!

python permutation

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

请解释此算法以获取String的所有排列

以下代码生成字符串的所有排列:

def permutations(word):
    if len(word)<=1:
        return [word]

    #get all permutations of length N-1
    perms=permutations(word[1:])
    char=word[0]
    result=[]
    #iterate over all permutations of length N-1
    for perm in perms:
        #insert the character into every possible location
        for i in range(len(perm)+1):
            result.append(perm[:i] + char + perm[i:])
    return result
Run Code Online (Sandbox Code Playgroud)

你能解释它是如何工作的吗?我不明白递归.

python string recursion permutation

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

智能方式生成排列和String的组合

String database[] = {'a', 'b', 'c'};
Run Code Online (Sandbox Code Playgroud)

我想基于给定生成以下字符串序列database.

a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
...
Run Code Online (Sandbox Code Playgroud)

我只能想到一个非常"虚拟"的解决方案.

public class JavaApplication21 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        char[] database = {'a', 'b', 'c'};

        String query = "a";
        StringBuilder query_sb = new StringBuilder(query);
        for (int a = 0; a < database.length; a++) {
            query_sb.setCharAt(0, database[a]);
            query = query_sb.toString();                    
            System.out.println(query);            
        }

        query = "aa";
        query_sb = …
Run Code Online (Sandbox Code Playgroud)

java algorithm combinations permutation

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

以递归方式生成列表的所有可能排列

我试图以递归方式递归生成列表中的所有项目.我已经看到了类似问题的一些解决方案,但我无法让我的代码工作.有人可以指出我如何修复我的代码?

这对所有S/O'ers开放,而不仅仅是Java人员.

(另外我应该注意它因SO异常而崩溃).

样本输入:[1,2,3]

输出:[1,2,3] [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1]

//allPossibleItems is an AL of all items 

//this is called with generatePerm(null, new ArrayList<Item>);

private void generatePerm(Item i, ArrayList<Item> a) {
      if(i != null) { a.add(i); }
      if (a.size() == DESIRED_SIZE){
          permutations.add(a);
          return;
      }
      for(int j = 0; j < allPossibleItems.size(); j ++) {
          if(allPossibleItems.get(j) != i)
            generatePerm(allPossibleItems.get(j), a);
      }
  }
Run Code Online (Sandbox Code Playgroud)

java algorithm permutation

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

按索引号获取指定度数的排列

我已经工作了几个小时,但无法弄明白.

将排列度定义为创建它时需要组合的最小转置数.所以程度(0, 1, 2, 3)为0,程度(0, 1, 3, 2)为1,程度(1, 0, 3, 2)为2,等等.

将空间Snd看作n具有度数的长度序列的所有排列的空间d.

我想要两种算法.一个在该空间中进行置换并为其分配索引号的另一个,并且另一个取一个项的索引号Snd并检索其置换.索引号显然应该是连续的(即在范围内0 to len(Snd)-1,每个排列具有不同的索引号.)

我希望这样实现O(sane); 这意味着如果你要求排列数17,算法不应该遍历0到16之间的所有排列来检索你的排列.

不知道怎么解决这个问题?

(如果你要包含代码,我更喜欢Python,谢谢.)

更新:

我想要一个解决方案

  1. 排列是根据它们的词典顺序排序的(而不是通过手动排序它们,而是通过一个有效的算法来给它们开始的词典顺序)和
  2. 我希望算法也接受不同程度的序列,所以我可以说"我希望在范围(5)的置换空间中的所有1或3或4级排列中排列数为78".(基本上函数会取一个度数元组.)这也会影响从排列计算索引的反函数; 根据度数集,指数会有所不同.

我过去两天试过解决这个问题而且我没有成功.如果你能提供Python代码,那就是最好的.

python algorithm permutation combinatorics time-complexity

13
推荐指数
1
解决办法
1249
查看次数