導航:首頁 > 源碼編譯 > 排列問題演算法思路

排列問題演算法思路

發布時間:2022-08-11 12:19:39

❶ 求高手解答本「實現數組全排列」的演算法思想的詳細思路。

如果排列因子數量很少, 可以用2進制位來表示。
如:["a", "b", "c", "d", "e"]可以按位表示
0 0 0 0 0

相應位為1時表示, 使用該因子。

❷ 求一個排列演算法,或者解決的思路!若干矩形拼湊成一個矩形,不能重疊,如何排列可以使最終面積最小

1. 計算寬度之和、高度之和,如果寬度和較大則先處理2.1,否則先處理2.2
2.1. 按照寬度從小到大排列,寬度相同的矩形拼成更大的矩形
2.2. 按照高度做相同的處理
3. 重復以上步驟,直到沒有寬、高相同的矩形

1. 計算寬度之和、高度之和,如果寬度和較大則先處理2.1,否則先處理2.2
2.1. 按照寬度從小到大排列,找出兩個矩形,使得拼接後的「矩形」面積中空缺部分最小(較可能是寬度相差較小的兩個矩形)。
2.2. 按照高度做相同的處理
3. 重復以上步驟,直到只剩下一個矩形(最終解)

以上兩段其實是一個意思:盡量用較小的「面積損失」最大限度的減少待處理矩形數。只是第一段是特例,也就是無「面積損失」的拼接。

不過,一般來說,這不會是最優解。

❸ 用遞歸法進行n個數的全排列,思路是怎樣的

比如有(1,2,3,4)這樣一組數

1.先分成(1)和(2,3,4),然後對(2,3,4)全排列
2.把(1)分別和(2,3,4)中的數對調
3.比如一次調換(2),(1,3,4),然後對(2,3,4)全排列
4.調換的算完了,恢復,變成(1),(2,3,4),再調換下一個(3),(1,2,4)

大概就是這樣的
--------------------------------
原來是填程序啊........
#include"stdio.h"
int a[10],n,count=0;
void perm(int k)
{
int p,t,j;
if( k==n )
{count++;
for(p=1;p<=k;p++) printf("%1d",a[p]);/*"%1d"中的數字是1,而不是字母l*/
printf(" ");
if( count%3==0 ) printf("\n");
return;}
for(j=k;j<=n;j++)
{t=a[k];a[k]=a[j];a[j]=t;
perm(k+1);
t=a[k];
a[k]=a[j];a[j]=t;}
}

main()
{int i;
printf("\nInput n:");
scanf("%d",&n);
for(i=1;i<=n;i++) a[i]=i;
perm(1);
}

❹ 數學排列問題

(1)4*4*3*2=96
(2)4*2*3*2=48
(3)(3+2+1)*2=12
12*3*2=72
(4)男生和女生相鄰的排法有:3*2*2*2=24種
若不限制任何條件共有:5*4*3*2=120種排法
則男生和女生相間的排法有:120-24=96種

❺ 數學的排列組合演算法加公式

不能重復的c(6,4) c(6,5) 1,2,3......,n n個數中 任取m個組合 c(n,m) 能重復的 6^4 6^5 1,2,3,。。。。n,n個數中,取m個組合(可重復) n^m 追問: c(n,m),讀作什麼?把1-6取4位帶進去怎麼算,可以教我嗎?50分感激不盡 回答: 這個是組合數 從n個元素裡面取m個元素的組合數 比如c(6,4)=(6*5*4*3)/(1*2*3*4) c(n,m)=[n*(n-1)*.........*(n-m+1)]/(1*2*......*m) 分子從n開始往下取 一直取m個連續的自然數相乘 分母從1取到m m個連續自然數相乘 追問: c(n,m)=[n*(n-1)*.........*(n-m+1)]/(1*2*......*m) 後面的/(1*2*......*m)是要除的么? 這個怎麼求的? 回答: 你題目說的不是很清楚 如果說要是組成數字 就不需要除以下面的(排列) 若只是取出來 不要求構成數字 則要除(組合) 補充: 只算組合 不要求構成數字 你的做法是對的 補充: 不可重復 15組 可重復 6^4=1296組 補充: 估計你的題目是要求構成數字的 不可重復的就是 6*5*4*3=360種 可重復的還是1296種 補充: 你一直都沒說 是否要求構成數字 取4個數字出來 是要構成一個4位數嗎? 如果是 則是360種 不是 則是15種 補充: 這是你自己想的題目吧 原題絕對不會說這樣的話 補充: 排列組合你沒學 這些一下你也搞不懂的 打個比方,從1,2,3中取2個數字 則有3種取法 {1,2},{1,3),{2,3} 如果你要是說取2個數字構成2位數 則有6種12,21,13,31,23,32 你對照公式看下 追問: 就是6位取4位構成4位數就有360種,那麼15種又是哪裡來的? 回答: 暈了 我已經說的很清楚了啊 例子都列出來了 15種是取出來不進行排列 360是還要進去排列組成4位數 補充: 你要是自學排列組合 還是先把定義搞清楚吧 再說 你出的這個題目本身說的就模稜兩可得 我一直在問你是否要求構成四位數 360和15得區別就在於這點 追問: 我終於懂了,在你們精心輔導下,我終於懂了,其實我對這些一竅不通,根本都沒學!謝謝你們懸賞最高!

❻ 最短路線(排列組合)解題思路

畫出題目所描述的網格,可以發現從西南到東北角最短要走10條短線,而且其中必有4條為豎線,從10條短線中選出4條作為路線中的豎線,也就確定了整條線路,所以一共有C10,4=210種路線(從10條線中選出6條橫線一樣)。
歡迎採納,記得評價哦!

❼ 排列組合萬能思路

1.2的倍數,末尾數字是偶數
(1)末尾數字是0,A(7,2)=42
(2)末尾數字是2,4,6 A(3,1)*A(6,1)*A(6,1)=108
2的倍數有150個
2.5的倍數,末尾數字是0,5
(1)末尾數字是0,A(7,2)=42
(2)末尾數字是5,A(6,2)*A(6,1)=36
5的倍數有42+36=78個

❽ JAVA中有哪幾種常用的排序方法每個排序方法的實現思路是如何的每個方法的思想是什麼

一、冒泡排序

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較 a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],以此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對 a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

優點:穩定;

缺點:慢,每次只能移動相鄰兩個數據。

二、選擇排序

冒泡排序的改進版。

每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。

選擇排序是不穩定的排序方法。

n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

①初始狀態:無序區為R[1..n],有序區為空。

②第1趟排序

在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

……

③第i趟排序

第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(1≤i≤n- 1)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

優點:移動數據的次數已知(n-1次);

缺點:比較次數多。

三、插入排序

已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、 b[2]、……b[m],需將二者合並成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來 a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)

優點:穩定,快;

缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。

三、縮小增量排序

由希爾在1959年提出,又稱希爾排序(shell排序)。

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。發現當n不大時,插入排序的效果很好。首先取一增量d(d<n),將a[1]、a[1+d]、a[1+2d]……列為第一組,a[2]、a[2+d]、 a[2+2d]……列為第二組……,a[d]、a[2d]、a[3d]……列為最後一組以次類推,在各組內用插入排序,然後取d'<d,重復上述操作,直到d=1。

優點:快,數據移動少;

缺點:不穩定,d的取值是多少,應取多少個不同的值,都無法確切知道,只能憑經驗來取。

四、快速排序

快速排序是目前已知的最快的排序方法。

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先任取數據 a[x]作為基準。比較a[x]與其它數據並排序,使a[x]排在數據的第k位,並且使a[1]~a[k-1]中的每一個數據<a[x],a[k+1]~a[n]中的每一個數據>a[x],然後採用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n] 兩組數據進行快速排序。

優點:極快,數據移動少;

缺點:不穩定。

五、箱排序

已知一組無序正整數數據a[1]、a[2]、……a[n],需將其按升序排列。首先定義一個數組x[m],且m>=a[1]、a[2]、……a[n],接著循環n次,每次x[a]++.

優點:快,效率達到O(1)

缺點:數據范圍必須為正整數並且比較小

六、歸並排序

歸並排序是多次將兩個或兩個以上的有序表合並成一個新的有序表。最簡單的歸並是直接將兩個有序的子表合並成一個有序的表。

歸並排序是穩定的排序.即相等的元素的順序不會改變.如輸入記錄 1(1) 3(2) 2(3) 2(4) 5(5) (括弧中是記錄的關鍵字)時輸出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按輸入的順序.這對要排序數據包含多個信息而要按其中的某一個信息排序,要求其它信息盡量按輸入的順序排列時很重要.這也是它比快速排序優勢的地方.

❾ C語言中全排列問題思路

方法1:如果位數不多窮舉
方法2:位數多建議遞歸。

❿ 排序有幾種方法

一. 冒泡排序

冒泡排序是是一種簡單的排序演算法。它重復地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把它們交換過來。遍歷數列的工作是重復的進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端

1.冒泡排序演算法的運作如下:
(1)比較相鄰的元素。如果第一個比第二個大(升序),就交換他們兩個
(2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素還是最大的數
(3)針對所有的元素重復以上的步驟,除了最後一個
二. 選擇排序
選擇排序是一種簡單直觀的排序演算法。他的工作原理如下:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(末尾位置),然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢
選擇排序的主要優點與數據移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,他們當中至少有一個將被移到最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動 元素的排序方法中,選擇排序屬於非常好的一種
三. 插入排序

插入排序是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在從後向前掃描的過程中,需要反復把已排序元素逐步向後挪位,為最新元素提供插入空間
四. 快速排序
快速排序,又稱劃分交換排序。通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都要小,然後再按此方法對兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
五 希爾排序過程

希爾排序是插入排序的一種,也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,演算法便終止。
六. 歸並排序

歸並排序是採用分治法(把復雜問題分解為相對簡單的子問題,分別求解,最後通過組合起子問題的解的方式得到原問題的解)的一個非常典型的應用。歸並排序的思想就是先遞歸分解數組,再合並數組

將數組分解最小之後,然後合並兩個有序數組,基本思路是比較兩個數組的最前面的數,水小九先取誰,取了後相應的指針就往後移一位。然後比較,直至一個數組為空,最後把另一個數組的剩餘部分復制過來即可

閱讀全文

與排列問題演算法思路相關的資料

熱點內容
2b2t伺服器怎麼獲得許可權 瀏覽:815
c語言javaphp 瀏覽:804
程序員技術不分高低嗎 瀏覽:619
dos不是內部或外部命令 瀏覽:708
PC機與單片機通訊 瀏覽:674
二級加密圖 瀏覽:113
壓縮機異音影響製冷嗎 瀏覽:711
德斯蘭壓縮機 瀏覽:490
程序員太極拳視頻 瀏覽:531
網上購買加密鎖 瀏覽:825
安卓為什麼軟體要隱私 瀏覽:83
虛擬主機管理源碼 瀏覽:811
java圖形圖像 瀏覽:230
單片機輸出口電平 瀏覽:486
java配置資料庫連接 瀏覽:479
java多態的體現 瀏覽:554
java的split分隔符 瀏覽:128
跪著敲代碼的程序員 瀏覽:239
web和php有什麼區別 瀏覽:120
加密的電梯卡怎麼復制蘋果手機 瀏覽:219