日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

三种求全排列方式之比较

發(fā)布時(shí)間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三种求全排列方式之比较 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一共有三種求全排列的方式:

第一種就是只適合用于非可重集的DFS實(shí)現(xiàn)

第二種就是可以用于可重集上的劉汝佳書(shū)上的代碼

第三種就是STL中的next——permutation

?

在對(duì)這三種方式做了比較之后發(fā)現(xiàn):

DFS實(shí)現(xiàn)的效率最高,當(dāng)n = 10的時(shí)候耗時(shí)才不到2s,但是n = 11的時(shí)候耗時(shí)14s

這是因?yàn)樵谇笈帕械臅r(shí)候DFS沒(méi)有去判斷這個(gè)元素在集合中是否重復(fù)的出現(xiàn)過(guò),只是直接的去判斷vis數(shù)組

第二種方式劉汝佳的實(shí)現(xiàn)方式,效率比較的低,甚至不如STL中的next——permuation函數(shù),但是我猜想STL中的實(shí)現(xiàn)方式和劉汝佳的差不多

第三種方式使用的時(shí)候必須要先把所要求全排列的集合進(jìn)行排序。

綜上所述:

以后遇到求全排列的時(shí)候,如果是非可重集,那么使用DFS(實(shí)際上還是一個(gè)遞歸的過(guò)程,即分治,結(jié)合)

如果是可重集,那么直接使用STL

下面附上第一種和第三種的代碼

//STL實(shí)現(xiàn)方式
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;const int maxn1 = 100 + 10;
int A1[maxn1];
int main()
{for(int i = 1;i <= 10;i++){A1[i] = i;}do{for(int i = 1;i <= 20;i++){printf("%d ",A1[i]);}printf("\n");}while(next_permutation(A1 + 1,A1 + 1 + 10));printf("%lf",(double)clock()/CLOCKS_PER_SEC);return 0;
}
//有的人把這種實(shí)現(xiàn)方式稱作DFS的方式?
//但是DFS雖然是遞歸實(shí)現(xiàn)的,但是它在決定下一次遞歸的時(shí)候是考慮和當(dāng)前點(diǎn)的關(guān)系的
//所以我更傾向于稱這種方式為遞歸實(shí)現(xiàn)的方式
//但是里面還是有很多圖論中的味道的。
#include<cstdio>
#include<cstring>
#include<ctime>
using namespace std;const int maxn = 100 + 10;
int ans[maxn];
int vis[maxn];
int A2[maxn];
void print_permutation1(int cur ,int n)
{if(cur > n){for(int i = 1; i <= n;i++){printf("%d ",ans[i]);}printf("\n");}else for(int i = 1; i <= n;i++){if(!vis[i]){vis[i] = 1;ans[cur] = A2[i];print_permutation1(cur + 1,n);vis[i] = 0;}}
}int main()
{for(int i = 1;i <= 11;i++){A2[i] = i;}memset(vis,0,sizeof(vis));print_permutation1(1,11);printf("%lf",(double)clock()/CLOCKS_PER_SEC);return 0;
}

?

轉(zhuǎn)載于:https://www.cnblogs.com/TorettoRui/p/10466388.html

總結(jié)

以上是生活随笔為你收集整理的三种求全排列方式之比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。