簡體   English   中英

C中所有可能的組合

[英]All Possible combinations in C

我試圖在C中找到一種有效的算法,該算法可為我提供給定字符集的所有組合。

該算法不應遞歸。 最后,數字位數應該是靈活的。 例如:

char set[] = "a1";
->
a1
aa
1a
11

我只找到了Perl解決方案,但它使用了substr() 我認為這不是那么快的性能。

對於大多數使用C的算法,我發現只是排列...

在德國C ++論壇上的一篇文章聲稱,C ++-STL解決方案比“原始”遞歸算法要快。

如果設置的大小是固定的N,那將很簡單-您可以有N個for循環,每個循環嵌套到前一個循環中。 由於您無法執行此操作且無法使用遞歸,因此必須計算所需的總迭代次數(好像是N ^ M),使用一個循環,然后使用/和%計算數組索引每個字符應該。 您最好也使用longs,因為N ^ M快速變大。

Python非常接近偽代碼。

您可以將Python源代碼讀取到itertools.permutations,然后在C語言中進行復制。

這是可行的演示:

#!/usr/bin/env python
import itertools

s='a1'

print set(itertools.permutations(s*len(s), len(s)))

輸出:

set([('1', '1'), ('a', '1'), ('a', 'a'), ('1', 'a')])

這是一個更簡單的方法:

>>> s='a1'
>>> ['{}{}'.format(x,y) for x in s for y in s]
['aa', 'a1', '1a', '11']


>>> s='abc'
>>> ['{}{}{}'.format(x,y,z) for x in s for y in s for z in s]
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 
 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 
 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 
 'cca', 'ccb', 'ccc']

要放松對列表的理解,請使用NESTED LOOPS,如下所示:

>>> for x in s:
...    for y in s:
...       for z in s:
...          print '{}{}{}'.format(x,y,z)

Wikipedia具有用於n元格雷碼的 C 代碼 通過使用數字作為輸入數組的偏移量,它可以轉換為您的問題。 您將需要進行一些動態分配,以處理輸入的任意長度。 一種相關的方法是進行嵌套循環,在該循環中,您有一個與輸入一樣長的循環計數器數組,另一個是您當前正在為其遞增的計數器。 例如,打印所有六位基數的數字,需要進行動態分配修改,但要顯示出以下原理:

int i;
int length = 5;
int max = 6;
int counters[length];
for (i=0; i<length; i++)
    counters[i] = 0;
for(;;) {
    for (i=length-1; i>=0; i--)
        printf("%d", counters[i]);
    printf("\n");
    for(i=0; i<length; i++) {
        counters[i]++;
        if (counters[i] < max)
            break;
        else
            counters[i] = 0;
    }
    if (i >= length)
        break;
}

好吧,我會給可能的組合編號,遍歷數字並轉換。

例如:要生成10個符號{'0','1',...,'9'}的所有大小3組合,我將從0循環到999,然后輸出“ 000”到“ 999”。

以相同的方式(kinda),要生成5個符號{'a','b',...,'e'}的所有大小為3的組合,我將循環從0到5 * 5 * 5-1並輸出以5為基的循環號,但帶有提供的符號。

編寫一個將整數轉換為字符串十六進制數字的函數,然后將該算法轉換為基數36(az加0-9)的數字。 使用一個for循環從1到(數字計數乘以基數)計數,然后每次調用函數。

  • 1變成1
  • 10變成
  • 35變成z
  • 36變成10
  • 46變成1a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM