第七章 集合

自我测试

本篇文章的测试用例及调试方法见前言

说明

是由一组无序且唯一(即不能重复)的项组成的,以[值,值]的形式存储元素。这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中。

运算

集合有并集,交集,差集,子集这几种运算
并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。

交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。

差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。

子集:验证一个给定集合是否是另一集合的子集。

简单图解

一个集合的基本方法

  • add(value) : 添加一个(或几个)新元素到集合中
  • delete(value) : 删除集合中元素,并返回
  • has(value) : 判断集合中是否有该值
  • values() : 返回一个包含集合中所有值的数组。
  • isEmpty() : 判断集合中是否有元素
  • clear() : 移除集合中的所有元素
  • size() : 返回集合的元素个数
  • union() : 并集
  • intersection() : 交集
  • difference() : 差集
  • isSubsetOf() : 子集

集合实现

export default class Set<T> {
    items: any;
    count: number;

    constructor() {
        this.items = {};
        this.count = 0;
    }

    /**
     * 判断是否有这个元素
     * @param element
     */
    has(element: any) {
        return Object.prototype.hasOwnProperty.call(this.items, element)
    }

    /**
     * 添加一个元素到对象中
     * 如果有就返回false,无就添加并返回true
     * @param element
     */
    add(element: T) {
        if (this.has(element)) {
            return false;
        }
        //将元素添加到集合中
        this.items[element] = element;
        //记得维护个数
        this.count++;
        return true;
    }

    /**
     * 删除集合中的一个元素
     * 如果没有就返回false,有就删除并返回true
     * @param element
     */
    delete(element: T) {
        if (this.has(element)) {
            delete this.items[element];
            //记得维护个数
            this.count--;
            return true;
        }
        return false;
    }

    /**
     * 以数组的形式返回集合中的所有元素
     */
    values() {
        let result = [];
        let items = this.items;
        for (const key in items) {
            result.push(items[key])
        }
        return result;
    }

    /**
     * 返回集合大小
     */
    size() {
        return this.count;
    }

    /**
     * 是否有元素
     */
    isEmpty() {
        return this.count === 0;
    }

    /**
     * 清空集合
     */
    clear() {
        this.items = {};
        this.count = 0;
    }

    /**
     * 并集
     * 这里可以利用add不会重复的性质
     * @param set
     */
    union(set: Set<T>) {
        let unionSet = new Set<T>();
        this.values().forEach((value) => {
            unionSet.add(value);
        })
        set.values().forEach((value) => {
            unionSet.add(value);
        })
        return unionSet;
    }

    /**
     * 交集
     * @param set
     */
    intersection(set: Set<T>) {
        let intersectionSet = new Set<T>();
        let lowSet = this.values();
        lowSet.forEach((val) => {
            if (set.has(val)) {
                intersectionSet.add(val);
            }
        })
        return intersectionSet;
    }

    /**
     * 差集
     * 当前集合中 包含  传入集合  不存在的元素
     * @param set
     */
    difference(set: Set<T>) {
        let differenceSet = new Set<T>();
        this.values().forEach((val) => {
            if (!set.has(val)) {
                differenceSet.add(val);
            }
        })
        return differenceSet;
    }

    /**
     * 子集
     * 当前集合是否为传入的集合的子集
     * @param set
     */
    isSubsetOf(set: Set<T>) {
        //当前集合小于传入集合
        if(this.count > set.count){
            return false;
        }
        //如果当前集合中的值都在传入的集合中,那么就说明是子集
        for (let i = 0,values = this.values(), len = values.length; i < len; i++) {
            if (!set.has(values[i])) {
                return false;
            }
        }

        return true;
    }

    toString() {
        if (this.isEmpty()) {
            return '';
        }
        const values = this.values();
        let objString = `${values[0]}`;
        for (let i = 1; i < values.length; i++) {
            objString = `${objString},${values[i].toString()}`;
        }
        return objString;
    }
}

书中代码

export default class Set<T> {
  private items: any;

  constructor() {
    this.items = {};
  }

  add(element: T) {
    if (!this.has(element)) {
      this.items[element] = element;
      return true;
    }
    return false;
  }

  delete(element: T) {
    if (this.has(element)) {
      delete this.items[element];
      return true;
    }
    return false;
  }

  has(element: T) {
    // return this.items.hasOwnProperty(element);
    return Object.prototype.hasOwnProperty.call(this.items, element);
  }

  values(): T[] {
    return Object.values(this.items);
  }

  union(otherSet: Set<T>) {
    const unionSet = new Set<T>();

    this.values().forEach(value => unionSet.add(value));
    otherSet.values().forEach(value => unionSet.add(value));

    return unionSet;
  }

  intersection(otherSet: Set<T>) {
    const intersectionSet = new Set<T>();

    const values = this.values();
    const otherValues = otherSet.values();

    let biggerSet = values;
    let smallerSet = otherValues;

    if (otherValues.length - values.length > 0) {
      biggerSet = otherValues;
      smallerSet = values;
    }

    smallerSet.forEach(value => {
      if (biggerSet.includes(value)) {
        intersectionSet.add(value);
      }
    });

    return intersectionSet;
  }

  difference(otherSet: Set<T>) {
    const differenceSet = new Set<T>();

    this.values().forEach(value => {
      if (!otherSet.has(value)) {
        differenceSet.add(value);
      }
    });

    return differenceSet;
  }

  isSubsetOf(otherSet: Set<T>) {
    if (this.size() > otherSet.size()) {
      return false;
    }

    let isSubset = true;
    this.values().every(value => {
      if (!otherSet.has(value)) {
        isSubset = false;
        return false;
      }
      return true;
    });

    return isSubset;
  }

  isEmpty() {
    return this.size() === 0;
  }

  size() {
    return Object.keys(this.items).length;
  }

  clear() {
    this.items = {};
  }

  toString() {
    if (this.isEmpty()) {
      return '';
    }
    const values = this.values();
    let objString = `${values[0]}`;
    for (let i = 1; i < values.length; i++) {
      objString = `${objString},${values[i].toString()}`;
    }
    return objString;
  }
}

leetcode对应训练

(0)

相关推荐

  • JavaScript数据结构-集合

    语雀入口 https://www.yuque.com/along-n3gko/ezt5z9 介绍 集合是由一组无序且唯一(即不能重复)的项组成的.比如由一个大于等于0的整数组成的集合:N={0,1,2 ...

  • 第七章:克服频遗关

    如果把戒色比作一项运动,可以说是铁人三项.断意淫是其中一个专项,警惕意识也是一个专项,如何控制遗精也是一个专项,情绪管理也是一项,养生意识也是一项,学习意识也是一项.准确地说,应该是"戒色六 ...

  • 『中医偏方精品』第七章 神经精神系统疾病

    第七章  神经精神系统疾病 一.面神经麻痹 面神经麻痹又称面神经炎,是一种急性非脓性的茎乳孔内的面神经炎.病因一般认为与风湿病及面神经管内的骨膜水肿有关.中医认为本病为"口眼歪斜" ...

  • 宝利老师导读《苏东坡传》第七章

    第七章 本章开始出现本书最重要男二号,王安石.可以说,这一章就是王安石的微型传记上.要点两个. 一.王安石其人. 原文最有概括性的一段:王安石是个怪人,思想人品都异乎寻常.学生时代很勤勉,除去语言学极 ...

  • (尾声篇)人市 第七章 || 田国彬(河北藁城)

    第 七 章     到了家里,天已经很晚了,来我家串门的邻居好几个,都是一门心思,你挣了多少钱,我躺在床上,支撑着腰坐起来,自豪地说:"二十块."     货货问我:"你 ...

  • 良书上的第七章里的几条偏方 必须收藏

    感冒鼻塞 葱白10根以上,生姜片50克,陈皮4片,淡豆豉20克,冰糖适量.入陶罐用水煮,煮熟去渣,乘热喝,然后盖棉被发汗,喝两三次有效. 高血压 白颈活蚯蚓15条,白糖100克.将蚯蚓剖开,洗净泥土, ...

  • 『呼吸系统疾病现代诊断与治疗』第七章 肺结核、结核性脑膜炎和非结核性分支杆菌肺病

    第一节 肺结核病 结核病是由结核分支杆菌引起的严重危害人民身体健康的慢性传染病.在结核病中尤以肺结核最为常见.排菌的肺结核患者作为传染源具有重要的流行病学意义.目前全球约1/3人口(17亿)感染结核菌 ...

  • 《道德经》第七章:超然物外

    主播 | 子淇 修音 | 一林 图编 |匀 [原文] 天长地久.天地所以能长久者,以其不自生,故能长生.是以圣人后其身而身先,外其身而身存.非以其无私邪(yé)?故能成其私. [译文] 天长地久.天地 ...

  • 湖南译界名家 || 陈逵:自传七章(英文)

    1927-1928年间,他的英诗创作达到了高潮,在美国当时最有影响的文艺刊物The Dial上先后5次刊登他的作品.1927年8月号的The Dial在扉页上介绍了五位作者,第一位就是Kwei Che ...

  • 小说(雪之纯) 第七章(嫁给我清人命债) 作者:孤雅独芳

    小说(雪之纯)第七章 (嫁给我清人命债) 作者:孤雅独芳 自小到大,头一次摊上这么大的事情,心欲裂,泪人一个,唇抖欲言又止. "雪儿,我陪你去他家看看吧!安慰一下他们的家人."殴阳 ...