04 Javascript数据结构与算法 之 集合

向右看齐 2022-03-16 13:44 309阅读 0赞

1. 定义

集合是一组无序唯一(即不能重复)的项组成。

2. Set实例

Es6中,已经有了Set类型。这里我们自己实现Set类。

  • Set类中数据存储,不再是使用数组,而是使用对象
  • add(value): 新增项
  • remove(value): 移除集合中的一个值
  • has(value): 集合中是否存在该值,true存在,false不存在
  • clear(): 清除所有项
  • size(): 集合包含元素个数
  • values(): 返回一个包含集合中所有值的数组
  1. function Set() {
  2. // 使用对象保存数据
  3. let items = {};
  4. let size = 0;
  5. this.has = (item) => ( item in items); // items.hasOwnProperty(item)
  6. // 添加成功返回true,已存在不进行添加直接返回false
  7. this.add = (item) => {
  8. if (!this.has(item)) {
  9. items[item] = item;
  10. size++;
  11. return true;
  12. }
  13. return false;
  14. };
  15. // 移除成功返回true
  16. this.remove = (item) => {
  17. if (this.has(item)) {
  18. delete items[item];
  19. size--;
  20. return true;
  21. }
  22. return false;
  23. };
  24. // 清空集合
  25. this.clear = () => (items = {});
  26. // 返回集合长度
  27. this.size = () => (size);
  28. // 获取所有的value值,作为一个数组返回,这里的key和value是相同的
  29. this.values = () => {
  30. let ret = [];
  31. for (let key in items) {
  32. ret.push(key);
  33. }
  34. return ret;
  35. }
  36. }
  37. var set = new Set();
  38. set.add(1);
  39. console.log(set.values()); //输出["1"]
  40. console.log(set.has(1)); //输出true
  41. console.log(set.size()); //输出1
  42. set.add(2);
  43. console.log(set.values()); //输出["1", "2"]
  44. console.log(set.has(2)); //true
  45. console.log(set.size()); //2
  46. set.remove(1);
  47. console.log(set.values()); //输出["2"]
  48. set.remove(2);
  49. console.log(set.values()); //输出[]
  50. 复制代码

3. 集合操作

对集合进行如下操作:

  • 并集:给定两个集合,返回一个包含两个集合中的所有元素的新集合
  • 交集:给定两个结合,返回一个包含两个集合中的共有元素的新集合

(./assets/15.png)

  • 差集:给定两个集合,返回一个包含所有存在于第一个集合不存在于第二个集合的元素的新集合。
  • 子集:验证一个给定集合是否是另一个集合的子集
  1. function Set() {
  2. // .....: 上面的实现
  3. // 并集
  4. this.union = (otherSet) => {
  5. let unionSet = new Set();
  6. let values = this.values();
  7. values.map((value) => {unionSet.add(value)});
  8. values = otherSet.values();
  9. values.map((value) => {unionSet.add(value)});
  10. return unionSet;
  11. };
  12. // 交集
  13. this.intersection = (otherSet) => {
  14. let intersectionSet = [];
  15. otherSet.values().map((item) => {
  16. console.log(this.has(item), '0---', item)
  17. if (this.has(item)) {
  18. intersectionSet.push(item);
  19. };
  20. });
  21. return intersectionSet;
  22. };
  23. // 差集
  24. this.difference = (otherSet) => {
  25. let diffSet = [];
  26. this.values().map((item) => {
  27. if (otherSet.has(item)) {
  28. return;
  29. }
  30. diffSet.push(item);
  31. });
  32. return diffSet;
  33. };
  34. // 子集合
  35. this.subSet = (otherSet) => {
  36. if (this.size() > otherSet.size()){
  37. return false;
  38. } else {
  39. var values = this.values();
  40. for (var i=0; i<values.length; i++){
  41. if (!otherSet.has(values[i])){
  42. return false;
  43. }
  44. }
  45. return true;
  46. }
  47. }
  48. }
  49. 复制代码

发表评论

表情:
评论列表 (有 0 条评论,309人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法数据结构集合

    重点知识 1. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是哈希查找。 2. 动态查找表和静态查找表的重要区别在于前者包含有插入和删除运算,而后者不包含这