資料結構之集合Set

2021-10-04 11:38:30 字數 4211 閱讀 7315

1、高層的資料結構,集合set和對映map,什麼是高層的資料結構呢,比如說是棧和佇列,這種資料結構更像是先定義好了使用介面,有了這些使用介面,包括資料結構本身所維持的一些性質,可以很方便的放入到一些應用中,但是底層實現可以多種多樣的,比如棧和佇列,底層實現既可以是動態資料,也可以是鍊錶。

集合就是承載元素的容器,集合set中有乙個重要的特性,就是每個元素在集合中只能存在一次,可以快速幫助去重工作,去重就是去除重複的元素,讓所有的元素只保留乙份。

2、基於二分搜尋樹實現的set集合。**,如下所示:

首先定義乙個介面,然後分別使用二分搜尋樹的方式和鍊錶的方式實現集合的功能。

1 package com.set;

2 3 /**

4 * @projectname: dataconstruct

5 * @package: com.set

6 * @classname: set

7 * @author: biehl

8 * @description: $

9 * @date: 2020/3/14 10:41

10 * @version: 1.0

11 */

12 public inte***ce set

使用二分搜尋樹的方式實現,**如下所示:

1 package com.set;

2 3 import com.tree.binarysearchtree;

4 5 /**

6 * 基於二分搜尋樹實現的set集合

7 *

8 * @projectname: dataconstruct

9 * @package: com.set

10 * @classname: bstset

11 * @author: biehl

12 * @description: $

13 * @date: 2020/3/14 10:44

14 * @version: 1.0

15 */

16 public class bstset> implements set

28 29 @override

30 public void add(e e)

34 35 @override

36 public void remove(e e)

39 40 @override

41 public boolean contains(e e)

44 45 @override

46 public int getsize()

49 50 @override

51 public boolean isempty()

54 55 public static void main(string args)

61 62 for (int i = 0; i < bstset.getsize(); i++)

65 66 // 集合set的刪除操作

67 bstset.remove(0 + "");

68 69 // 集合set的是否包含某個元素

70 boolean contains = bstset.contains(0 + "");

71 system.out.println(contains);

72 73 // 集合set的大小

74 system.out.println(bstset.getsize());

75 76 // 判斷集合set是否為空

77 system.out.println(bstset.isempty());

78 }

79 80 }

3、二分搜尋樹和鍊錶都是屬於動態資料結構。二分搜尋樹和鍊錶的資料都是儲存到node節點中的。

1 package com.set;

2 3 import com.linkedlist.linkedlist;

4 5 /**

6 * @projectname: dataconstruct

7 * @package: com.set

8 * @classname: linkedlistset

9 * @author: biehl

10 * @description: $

11 * @date: 2020/3/14 11:54

12 * @version: 1.0

13 */

14 public class linkedlistsetimplements set

24 25 @override

26 public void add(e e)

31 }

32 33 @override

34 public void remove(e e)

37 38 @override

39 public boolean contains(e e)

42 43 @override

44 public int getsize()

47 48 @override

49 public boolean isempty()

52 53 public static void main(string args)

59 60 // 集合set的刪除操作

61 linkedlistset.remove(0);

62 63 // 集合set的是否包含某個元素

64 boolean contains = linkedlistset.contains(0);

65 system.out.println(contains);

66 67 // 集合set的大小

68 system.out.println(linkedlistset.getsize());

69 70 // 判斷集合set是否為空

71 system.out.println(linkedlistset.isempty());

72 73 }

74 }

4、基於鍊錶的集合實現的效能,慢與基於二分搜尋樹的集合實現。

集合set的時間複雜度分析。

1)、增加add。

方式一,基於鍊錶實現的linkedlistset,本來在鍊錶中新增乙個元素時間複雜度是o(1)的,但是對於集合set來說,需要去除重複元素,所以對於鍊錶需要先查詢一遍,查詢的時間複雜度o(1),所以整體上,基於linkedlistset方式實現的的新增操作,時間複雜度是o(1)。

方式二,基於二分搜尋樹的實現的bstset,新增操作,每次新增都可以排除一半元素,因為大於根節點去右子樹,小於根節點去左子樹,新增操作從根節點向葉子節點出發,一層一層的向下走,經歷的節點是二分搜尋樹的深度,新增操作、查詢元素、刪除元素都是這個思路,那麼平均時間複雜度的是o(h)或者o(logn),其中h是二分搜尋樹的深度。最差的效果是時間複雜度的是o(n)。解決這個問題可以使用平衡二叉樹。

2)、查詢contails。

方式一,基於鍊錶實現的linkedlistset,查詢操作的時間複雜度是o(1),因為要把所有的元素遍歷。

方式二,基於二分搜尋樹的實現的bstset,那麼平均時間複雜度的是o(h)或者o(logn),其中h是二分搜尋樹的深度。最差的效果是時間複雜度的是o(n)。解決這個問題可以使用平衡二叉樹。

3)、刪除remove。

方式一,基於鍊錶實現的linkedlistset,刪除操作的時間複雜度是o(1),因為需要先找到待刪除元素的前面哪乙個節點,再將這個元素刪除。

方式二,基於二分搜尋樹的實現的bstset,那麼平均時間複雜度的是o(h)或者o(logn),其中h是二分搜尋樹的深度。最差的效果是時間複雜度的是o(n)。解決這個問題可以使用平衡二叉樹。

總結,那麼n和h的比較是怎麼樣的呢,對於一棵滿二叉樹來說,如果一共有h層的話,節點個數一共是2的h次方減乙個節點。那麼2^h-1 = n,則h = log2(n + 1),log以2為底的n + 1的對數。h = o(logn),此時不管以那個數字為底的,直接簡寫成h = o(logn)。

Python資料結構之集合Set

python中的set 資料結構具有的乙個特殊屬性就是set 中不存在重複元素 1 集合定義 a set 2 向set中新增元素 a set 1,2,3,4 用add a.add 5 用或運算符號 a set還有個update函式,可以接受多組引數一次新增到set裡a.update 5,6,3 11...

集合 C 資料結構 集合 set

工作也不想做,部落格也不想寫qaq又是乙個難熬的下午 這個月的leetcode每日一題落下了好多,主要是動態規劃我真不會,看題解基本也想不明白,dp我的一生之敵 x x 這裡要介紹一下順序容器和關聯容器的區別。順序容器就是按照元素在容器中的位置,來進行儲存和訪問,例如vector deque lis...

Python資料結構集合 set

集合 set,collection翻譯為集合型別或容器,是乙個大概念。集合特性 可變 無序 不重複 可迭代的元素的集合。示例 1 set集合的元素要求必須是可hash的 2 目前所學過的不可hash的型別有 list set bytearray dict 3 元素不可以索引,因為無序 4 set可使...