C演算法精解 集合 實現和分析

2021-06-28 13:26:10 字數 3896 閱讀 2255

/* 將乙個成員插入到集合中,由於集合中的成員只能出現一次,因此將首先呼叫set_is_member以確保集合中不會已經包含了待插入的成員;若集合中不存在待插入的成員,就呼叫list_ins_next將待插入的成員插入到集合中

*//* set_inert的複雜度為o(n)級,因為set_is_member需要遍歷整個集合,需要o(n) ;而list_ins_next則以o(1)插入*/

intset_insert(set *set, const void * data)

return list_ins_next(set, list_tail(set), data);}/*

set_remove 複雜度為o(n) ,n為集合的成員size

*/int

set_remove(set *set, void ** data)

if(member == null)

return -1;

return list_rem_next(set, prev, data);}/*

set_union

1:操作將建立乙個集合,記做setu,由引數set1與set2所指定的集合的並集結果;

2:複雜度為o(mn) ,m,n分別為集合set1與set2的成員個數

3:在第乙個迴圈中,遍歷了set1中的每個成員並且把他們插入setu中,這個過程的時間複雜度o(m)

5:在第二個迴圈中,遍歷了set2中的每個成員並且把他們插入setu中,這個過程的時間複雜度o(n)

而這個迴圈需要包含時間複雜度為o(n)的set_is_member,因此第二次迴圈的總體複雜度為o(mn)

6:由於這兩個迴圈是順序執行的,因此set_union的執行時複雜度比單獨執行這兩次迴圈還要大,

記為o(mn)

*/int

set_union(set *setu,const set *set1,const set *set2)

}// insert the members of the second set

for (member = list_head(set2); member != null; member = list_next(member)) else}}

return 0;}/*

set_intersection

1:操作將建立乙個集合,記做seti,由引數set1與set2所指定的集合的交集結果;

2:複雜度為o(mn) ,m,n分別為集合set1與set2的成員個數

*/int

set_intersection(set *seti,const set *set1,const set *set2)}}

return 0;}/*

set_difference

1:操作將建立乙個集合,記做setd,由引數set1與set2所指定的集合的差集結果;

2:複雜度為o(mn) ,m,n分別為集合set1與set2的成員個數

*/int

set_difference(set *setd,const set *set1,const set *set2)}}

return 0;}/*

set_is_member用來判斷某個成員是否再集合中出現過 複雜度為o(n) ,n為集合的成員size

*/int

set_is_number(const set *set,const void *data)

}return 0;}/*

set_is_subset 操作用來判斷集合set1是否為集合set2的子集合

1:由於乙個集合是另外乙個集合的子集,則set1所包含的成員個數必須要小於等於set2所包含的

成員個數,因此首先比較它們的成員個數

複雜度為o(mn),m,n分別為set1與set2的成員個數size

*/int

set_is_subset(const set *set1,const set *set2)

for (member = list_head(set1); member != null; member = list_next(member))

return 1;}/*

set_is_equal用來判斷set1與set2是否相等

1:因為兩個相等的集合必然有相同的成員個數size,所以就從比較它們的成員個數size開始

2:若兩個集合的成員個數不等,則兩個集合必然不想等

3:如果兩個集合的成員個數相同,只需要確定set1是否為set2的子集就可以返回結果了,

可以通過呼叫set_is_subset來實現

4:set_is_subset 執行時 複雜度為o(mn),m,n分別為set1與set2的成員個數size

*/int

set_is_equal(const set *set1,const set *set2)

return set_is_subset(set1, set2);

}

演算法精解 8 集合應用 集合覆蓋問題

1 問題具象 有選手集合p 每個選手有乙個或多個技能。所有技能集合s 要求 選出最佳選手集合,包含所有技能,人員集合c。2 解決方案 集合覆蓋法 貪心法思路,不一定是最優解 1 選出有最多技能的人員amax 2 s中去掉amax中的技能 p中去掉amax 3 迴圈找出下乙個相對amax,直到s中技能...

演算法精解一(C語言版)

最近無事 抽出點時間來整理一下演算法 希望對自己有進一步的幫助和對學習演算法的同行有一些幫助吧!講到演算法 這個詞是很重乙個解決問題的途徑 無論在什麼行業 演算法都是很重要的。不管你是否承認,無論哪種軟體開發專案,幾乎所有的程式設計師,開發者在日常工作中都要同資料結構和演算法打交道。當我們閱讀原始碼...

演算法精解五(C語言版)

指標操作 在c語言中,對於任何型別t,我們都可以在t所在的記憶體位址處產生乙個包含對此物件位址的對應變數。如果用比較直觀方式來看待這種變數,它們實際上是一種指向物件的變數,如果用比較直觀方式來看待這種變數,它們實際上是一種指向物件的變數 因此,這些變數稱為指標。在c語言中,指標是構建資料結構和操作記...