zoukankan      html  css  js  c++  java
  • 集合的实现 -- 数据结构与算法的javascript描述 第九章

    集合

    集合(set)是一种包含不同元素的数据结构。
    集合中的元素称为成员。
    集合的两个最重要特性是:首先,集合中的成员是无序的;其次,集合中不允许相同成员存在。

    code

    function Set(){
            var me = this;
            me.dataStore = [];
            me.add = add;
            me.remove =remove;
            me.size = size;
            me.union = union;
            me.intersect = intersect;
            me.subset = subset;
            me.difference = difference;
            me.show = show;
            me.contains = contains;
    
            function add(data){
                if(me.dataStore.indexOf(data)<0){
                    me.dataStore.push(data)
                    me.dataStore.sort();
                    return true;
                }else{
                    return false;
                }
            }
            function remove(data){
                var pos = me.dataStore.indexOf(data);
                if(pos>-1){
                    me.dataStore.splice(pos,1)
                    return true;
                }else{
                    return false;
                }
    
            }
    
            /**
             * 合并集合
             * @param set
             */
            function union(set){
                var tempSet = new Set();
                for(var i=0;i<me.dataStore.length;i++){
                    tempSet.add(me.dataStore[i])
                }
                for(var i=0;i<set.dataStore.length;i++){
                    if(!tempSet.contains(set.dataStore[i])){
                        tempSet.add(set.dataStore[i])
                    }
                }
                return tempSet;
            }
    
            /**
             * 寻找交集
             */
            function intersect(set){
                var tempSet = new Set();
                for(var i=0;i<me.dataStore.length;i++){
                    if(set.contains(me.dataStore[i])){
                        tempSet.add(me.dataStore[i])
                    }
                }
                return tempSet;
            }
    
            /**
             * 判断是否子集
             * @param set
             * @returns {boolean}
             */
            function subset(set){
                if(me.size()>set.size()) {
                    return false;
                }else{
                   for(var i in me.dataStore){
                       if(!(set.contains(me.dataStore[i]))){
                           return false;
                       }
                   }
    
                }
                return true;
    
            }
    
            /**
             * 比较2集合不同 并返回
             * @param set
             * @returns {Set}
             */
            function difference(set){
                var tempSet = new Set();
                for(var i=0;i<me.dataStore.length;i++){
                    if(!set.contains(me.dataStore[i])){
                        tempSet.add(me.dataStore[i])
                    }
                }
                return tempSet;
            }
    
            /**
             * 获取该集合长度
             * @returns {Number}
             */
            function size(){
                return me.dataStore.length;
            }
            /**
             * 显示该集合
             * @returns {Array}
             */
            function show(){
                console.log(me.dataStore)
                return me.dataStore;
            }
    
            /**
             * 检查该成员是否属于该集合
             * @param data
             * @returns {boolean}
             */
            function contains(data){
                if(me.dataStore.indexOf(data)>-1){
                    return true;
                }else{
                    return false;
                }
            }
        }
    

    tests

    //集合测试
                var names = new Set();
                names.add("David");
                names.add("Jennifer");
                names.add("Cynthia");
                names.add("Mike");
                names.add("Raymond");
                //show 测试
                names.show();
                //remove测试
                names.remove("David")
                names.show()
    
    //union 合并集合 测试
                var cis = new Set();
                cis.add("Mike");
                cis.add("Clayton");
                cis.add("Jennifer");
                cis.add("Raymond");
                var dmp = new Set();
                dmp.add("Raymond");
                dmp.add("Cynthia");
                dmp.add("Jonathan");
    
                var it = cis.union(dmp);
                it.show()
    
                //交集测试
                var inter = cis.intersect(dmp)
                inter.show();
    
                //判断是否子集
                var it2 = new Set();
                it2.add("Cynthia");
                it2.add("Clayton");
                it2.add("Jennifer");
                it2.add("Danny");
                it2.add("Jonathan");
                it2.add("Terrill");
                it2.add("Raymond");
                it2.add("Mike");
                var dmp2 = new Set();
                dmp2.add("Cynthia");
                dmp2.add("Raymond");
                dmp2.add("Jonathan");
                console.log("dmp2 是否是it2 子集:"+dmp2.subset(it2))
    
                //找不同
    
                var d = it2.difference(dmp2)
                d.show();
    
  • 相关阅读:
    ZJOI2017
    李超线段树
    单调性优化dp
    ZJOI2018 树
    【ZJOI2017】汉诺塔
    暂存
    聚类的方法(层次聚类,K-means聚类)
    哈希表(散列表)
    多路查找树B树
    二叉排序树
  • 原文地址:https://www.cnblogs.com/iyueyao/p/4015023.html
Copyright © 2011-2022 走看看