Array-数组

本文介绍使用不同数据结构实现集合操作的方法,包括一维数组、布尔数组及位数组(Bitset),并提供了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Set: 
简单的资料结构

程度★ 难度★

简单的资料结构

set 是指数学名词「集合」。在这里我们只考虑元素为整数的集合。「集合」有几点特性:

一、空集合。

二、集合中的元素不会重复。

要表达一个集合,可以直观的用一条一维的int 阵列:将集合里的所有元素,依序放进阵列中。再用一个变数,纪录元素总数。

 
  1. struct  Set
  2. {
  3.     int  array 1000 ];     //可存入1000个元素
  4.     int  num ;             //纪录集合中有多少元素
  5. };

这样就能存入1000 个元素。

然而,以这种资料结构,做联集、交集、差集之类的运算,则会相当麻烦,也会比较慢。

【待补程式码】【待补link list 的纪录法】

UVa 496

Set: 
另一种资料结构

程度★ 难度★

另一种资料结构

另外一种表达集合的方法,是用一条一维的bool 阵列:集合里若有x 这个元素,就让array[x] 这个位置为true ,反之则为false 。其概念类似于数学领域提到的Index Set 。

它的坏处就是数值有界限、受阵列大小影响。但是,以这种资料结构,做联集、交集、差集之类的运算,则会比较快,时间复杂度为O( 元素总个数) 。

 
  1. bool  set 1000 ];  //一个集合,元素的数值范围为0到999
  2.  
  3. // 加入元素
  4. void  add_element bool  1000 ],  int  element)
  5. {
  6.     element ] =  true ;
  7. }
  8.  
  9. // 除去元素
  10. void  delete_element bool  1000 ],  int element )
  11. {
  12.     element ] =  false ;
  13. }
  14.  
  15. // 联集
  16. void  union bool  1000 ],  bool  1000 ], bool  1000 ])
  17. {
  18.     for  ( int  1000 ++)  ] = ] ||  ];
  19. }
  20.  
  21. // 交集
  22. void  intersection bool  1000 ],  bool  [1000 ],  bool  1000 ])
  23. {
  24.     for  ( int  1000 ++)  ] = ] &&  ];
  25. }
  26.  
  27. // 差集
  28. void  difference bool  1000 ],  bool  1000],  bool  1000 ])
  29. {
  30.     for  ( int  1000 ++)  ] = ] && ! ​​b ];
  31. }
  32.  
  33. // 补集
  34. void  complement bool  1000 ],  bool  1000])
  35. {
  36.     for  ( int  1000 ++)  ] = ! ];
  37. }
  38.  
  39. // 判断是否为空集合
  40. bool  empty bool  1000 ])
  41. {
  42.     for  ( int  1000 ++)
  43.         if  ( ])
  44.             return  false ;
  45.     return  true ;
  46. }
  47.  
  48. // 判断是否没有交集
  49. bool  disjoint bool  1000 ],  bool  1000])
  50. {
  51.     for  ( int  1000 ++)
  52.         if  ( ] &&  ])
  53.             return  false ;
  54.     return  true ;
  55. }
  56.  
  57. // 判断a有没有包含b
  58. bool  contain bool  1000 ],  bool  1000 ])
  59. {
  60.     for  ( int  1000 ++)
  61.         if  (! ] &&  ])
  62.             return  false ;
  63.     return  true ;
  64. }

这里是练习题。

UVa 608 665 10227

Set: 
Bit Array

程度★ 难度★

Bit Array ( Bitset )

还有一种方法,是用bit 来代替bool 变数。在电脑当中,一个bit 只有0 和1 两种值,类似于bool 变数,两者都可以用来表示一个集合元素存不存在。利用bit 们来表达集合,可以节省储存空间,也可以节省运算时间。

一个int 变数所使用的记忆体大小为32bit ,可以当作是32 个数字的集合。需要更多bit 的话,就开一条阵列吧!

 
  1. typedef  int  Bitset 100 ];     //一个集合,元素的数值范围为0到3199
  2.  
  3. // 求出element所在的阵列格子,即是element除以32的商数
  4. int  get_pos int  element )
  5. {
  6.     return  element  >>  ;
  7. }
  8.  
  9. // 求出element在阵列格子当中是第几个bit,即是element除以32的余数
  10. // 然后让一个bit位移至适当位置,以利计算
  11. int  get_bit int  element )
  12. {
  13.     return   << ( element  &  31 );
  14. }
  15.  
  16. // 加入元素
  17. void  add_element Bitset  ,  int  element )
  18. {
  19.     get_pos element )] |=  get_bit element);
  20. }
  21.  
  22. // 除去元素
  23. void  delete_element Bitset  ,  int  element )
  24. {
  25.     get_pos element )] &= ~ get_bit element);
  26. }
  27.  
  28. // 联集
  29. void  union Bitset  ,  Bitset  ,  Bitset  )
  30. {
  31.     for  ( int  100 ++)  ] = ] |  ];
  32. }
  33.  
  34. // 交集
  35. void  intersection Bitset  ,  Bitset  Bitset  )
  36. {
  37.     for  ( int  100 ++)  ] = ] &  ];
  38. }
  39.  
  40. // 差集
  41. void  difference Bitset  ,  Bitset  ,  Bitset )
  42. {
  43.     for  ( int  100 ++)  ] = ] & ~ ];
  44. }
  45.  
  46. // 补集
  47. void  complement Bitset  ,  Bitset  )
  48. {
  49.     for  ( int  100 ++)  ] = !];
  50. }
  51.  
  52. // 判断是否为空集合
  53. bool  empty Bitset  )
  54. {
  55.     for  ( int  100 ++)
  56.         if  ( ])
  57.             return  false ;
  58.     return  true ;
  59. }
  60.  
  61. // 判断是否没有交集
  62. bool  disjoint Bitset  ,  Bitset  )
  63. {
  64.     for  ( int  100 ++)
  65.         if  ( ] &  ])
  66.             return  false ;
  67.     return  true ;
  68. }
  69.  
  70. // 判断a有没有包含b
  71. bool  contain Bitset  ,  Bitset  )
  72. {
  73.     for  ( int  100 ++)
  74.         if  (~ ] &  ])
  75.             return  false ;
  76.     return  true ;
  77. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值