今天在實驗室會議中,我被問到了這個問題。(任何語言)使用交換查找矢量中元素的所有排列
我們可以想象一個包含元素1 ... N-1,長度爲N的向量。是否有一個算法(系統)方法來生成向量中所有元素的排列或順序。一種提議的方法是交換隨機元素。顯然,如果以前生成的所有排列都存儲起來以備將來參考,那麼這將工作,但這顯然是一種非常低效的方法,無論是在空間上還是在時間上都是明智的。
這樣做的原因是從矢量中的特殊位置移除特殊元素(例如零的元素),其中不允許這樣的元素。因此,隨機方法並不是很荒謬,但想象一下這樣一種情況,即元素的數量很大,可能的排列的數量(在任何「特殊位置」都沒有「特殊元素」)是低。
我們試圖通過這個問題工作爲N的情況下= 5:
x = [1, 2, 3, 4, 5]
首先,交換元件4和5:
x = [1, 2, 3, 5, 4]
然後交換3和5:
x = [1, 2, 4, 5, 3]
然後3和4:
x = [1, 2, 5, 4, 3]
最初我們認爲使用兩個索引ix和jx可能是一個可能的解決方案。喜歡的東西:
ix = 0;
jx = 0;
for(;;)
{
++ ix;
if(ix >= N)
{
ix = 0;
++ jx;
if(jx >= N)
{
break; // We have got to an exit condition, but HAVENT got all permutations
}
}
swap elements at positions ix and jx
print out the elements
}
這適用於其中N = 3,但是它並不適用於更高的工作N.我們認爲,這種做法可能是沿着正確的線的情況。我們試圖擴展到使用3個索引的方法,出於某種原因,我們認爲這可能是解決方案:使用第三個索引標記索引ix開始或結束的向量中的位置。但是我們陷入了困境,並決定向SO社區尋求建議。要做到這一點
請參閱http://stackoverflow.com/questions/12256824/how-to-increase-memory-to-handle-super-large-lua-tables/12267647#12267647。 – lhf
對於C++,總是存在std :: next_permutation(按照字典順序排列,沒有交換) –