/* 將乙個成員插入到集合中,由於集合中的成員只能出現一次,因此將首先呼叫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語言中,指標是構建資料結構和操作記...