用0和1組合填充數組的好算法是什麼? 例如,如果我有三列的組合將是: (1 1 1) (0 1 1) (1 0 1) (0 0 1) (1 1 0) (0 1 0) (1 0 0) (0 0 0) 它總共有8行(我希望我就在這裏)。 那麼如何預先確定所需的行數(取決於N列數),然後如何以編程方式填充數組?任何編程語言都很好(我標記C和lisp是因爲熟悉),它是所需的算法。感謝0和1的數組組合
0和1的數組組合
回答
從0基座2
0 = 000
1 = 001
2 = 010
...
7 = 111
組合的數量僅僅是2至N的功率(或1 << N
在C)。這些值只是數字0到N-1的二進制表示。
這是2^(NUMBER_OF_COLUMNS)
如果downvote是「-1」我糾正它 – 2010-08-23 16:41:43
我有1位(1列)。 2 ^(1-1)= 2^0 = 1。因此一位只能處於一種狀態。 0.5 – 2010-08-23 16:43:13
這簡直是一個集的子集的數量。你有3列,其中每列是0或1.
你想知道你需要多少行。
您有N列。讓每列成爲一個項目。該列有兩種可能的選擇,並且之後每列有兩種選擇。由於每列有N列和2個選項,因此您有2^N個子集。
#include "stdafx.h"
#include <cmath>
void converttobin(const int row, const int cols, int** parrbin)
{
int j = cols;
int val = row;
while (val){
parrbin[row][--j] = val % 2;
val /= 2;
}
for (int i=0; i<j; i++)
parrbin[row][i] = 0;
}
void testfun()
{
double cols;
cout << "Number of columns - ";
cin >> cols;
int maxrows = pow(2, cols);
int **parrbin = new int*[maxrows];
for (int i=0; i<maxrows; i++)
parrbin[i] = new int[static_cast<int>(cols)];
for (int row=0; row<maxrows; row++)
{
converttobin(row, cols, parrbin);
cout << row << ": ";
for (int i=0; i<cols; i++)
cout << parrbin[row][i] << '\t';
cout << endl;
}
for (int i=0; i<maxrows; i++)
delete [] parrbin[i];
delete [] parrbin;
}
這裏有一個替代的方式來填寫數組:
for (unsigned i = 0; i < nRows; ++i) {
for (unsigned j = i, k = nCols-1; j != 0; j >>= 1, --k)
bin[i][k] = j & 1;
}
只記得到數組初始化爲零。
@polygenelubricants對他的評論是正確的。在這種情況下實際填充數組是不必要的浪費。如果你需要一個集合,這裏是一個令人難以置信的簡單的實現你想要的列表界面:
class BinarySequenceList extends AbstractList<String> {
private final int digits;
public BinarySequenceList(int digits) {
if (digits >= 32 || digits <= 0) { throw new IllegalArgumentException(); }
this.digits = digits;
}
public String get(int index) {
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException();
}
String padded = "00000000000000000000000000000000" +
Integer.toBinaryString(index);
return padded.substring(padded.length() - digits);
}
public int size() { return 1 << digits; }
}
//usage:
List<String> seq = new BinarySequenceList(5);
for (String s : seq) {
System.out.println(s);
}
//prints:
00000
00001...
哎呀,只是注意到這實際上沒有標記爲Java,因爲我回答的大多數問題。對語言不相關感到抱歉;但是這個觀點並不重要 – 2010-08-23 20:34:34
- 1. 0-1揹包的計數組合
- 2. 僅包含0和1值的數組
- 3. 按Pig中的組計數1和0
- 4. 針對不同列的組合計算0和1的數字
- 5. 關於C - >數組[1] [0]和數組[0] [1]中的二維數組是否相同?
- 6. 如何產生的1024×10矩陣0的組合和1
- 7. 中的R 0-1總和之間的值的1的所有組合
- 8. 組合兩個數組1個陣列
- 9. 將0和1的數組轉換爲整數
- 10. 加載(0/1)串到位數組
- 11. 轉換設置爲numpy 0-1數組?
- 12. 意義:數組1:.word 0:20
- 13. 如何將數組值0和255轉換爲相應的0和1陣列
- 14. 隨機數組的1和0的使用方法
- 15. 組組合和盡數
- 16. 元組和函數組合
- 17. 將多個表單數組組合爲1個數組
- 18. 將1和0的字符串轉換爲字節數組
- 19. 如何使隨機填充0和1的int 2D數組?
- 20. 如何減去兩個數組的[0]和[1]等
- 21. 將1和0的數組轉換爲二進制變量
- 22. 將0和1的數組轉換爲base36字符串
- 23. Jaudiotagger getAll(FieldKey.COMMENT)產生一個0和1的數組
- 24. java填充2維數組與隨機0和1的
- 25. 算法:在1和0的數組中找到包含K 0的最小連續數組
- 26. 組合數組和求和整數
- 27. (* b)[0] vs * b [0] - 數組和指針
- 28. 由幾個數組合並和組合
- 29. 幫助分組數組索引(objectAtIndex 0 - 9)= 1索引點
- 30. 的SelectedIndex = -1,數據綁定組合
這不是一個二進制計數的數字嗎?所需的行數是2^N。 – Starkey 2010-08-23 16:37:31
大多數情況下,您並不需要填充數組,而僅僅是通過所有/某些可能性。請注意這是指數。如果'N = 32',那就是至少4GB。 4GB的數字只是從'0 ... 0'一直到'1 ... 1',依次排列。換句話說,4GB絕對沒有什麼有趣的。 – polygenelubricants 2010-08-23 16:39:40
實際上它是32GB。至少。 – polygenelubricants 2010-08-23 16:55:21