列舉所有子集的三種演算法詳解 《演算法入門經典》

2022-08-12 11:36:18 字數 962 閱讀 6768

方法一:增量構造法

理解遞迴必須得理解函式到底是做什麼的。

#includevoid print_subset(int n,int *a,int cur)  //print_subset的功能是列印集合的cur個元素的子集,並且目前a陣列中已經儲存了要列印的集合 

\n");

int mi=cur?a[cur-1]+1:0; //利用字典序避免重複列印

for (int i=mi;i

}intmain()

; scanf("%d",&n);

print_subset(n,a,0); //初始時a中儲存了0個元素的子集,開始遞迴列印

return 0;

}

方法二:位向量法

列舉每一位選或者不選,複雜度比方法一略高但更好理解,因為與輸出全排列思路差不多,滿n位就輸出。

#includeint a[10];

void print_subset(int n,int *b,int cur) //確定第cur位選或者不選

\n");

} else

}intmain()

; scanf("%d",&n);

for (int i=0;ii;

print_subset(n,b,0);

return 0;

}

缺點是輸出不是按照字典序。

方法三:二進位制法

稍加思考就會發現,方法二其實與二進位制是對應的。

#includeint a[10];

void print_subset(int n,int b) //n位的集合,b狀態列印

\n");

}void p_s(intn)

intmain()

這個方法優點就是**簡單。

注意:以上三種方法輸出順序不同。

三種全排序演算法詳解

演算法思路 全排列可以看做固定前i位,對第i 1位之後的再進行全排列,比如固定第一位,後面跟著n 1位的全排列。那麼解決n 1位元素的全排列就能解決n位元素的全排列了,這樣的設計很容易就能用遞迴實現。附 段 void permutation1 char str,int sbegin,int send...

三種頁面置換演算法(詳解)

位址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。一 先進先出 fifo 1 原理 把記憶體中駐留...

MySQL InnoDB行鎖演算法 三種詳解

字面意思,給一行資料加鎖。innodb 行鎖是通過給索引上的索引項加鎖來實現的,如果沒有索引,innodb 將通過隱藏的聚簇索引來對記錄加鎖。注意 行鎖必須有索引才能實現,否則會自動鎖全表,那麼就不是行鎖了。兩個事務不能鎖同乙個索引。1 record lock 記錄鎖,單個行記錄上的鎖 鎖住具體的索...