集合簡介本系列所有文章:
第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列
第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表
第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合
第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表
第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹
記得高一數(shù)學(xué)第一節(jié)課學(xué)的就是集合,現(xiàn)在快大四了再看到它有種見了老朋友的感覺。哈哈,閑話不多扯,進入正題。
集合是由一組無序且不重復(fù)的項組成的數(shù)據(jù)結(jié)構(gòu)。這里集合的概念和高中數(shù)學(xué)類似,也有空集,交集,并集,子集等概念,只不過在這里就沒有那么復(fù)雜的證明題了。那么接下來就用JavaScript實現(xiàn)一下集合。
用JavaScript實現(xiàn)集合老規(guī)矩,先弄一個構(gòu)造函數(shù)出來
function Set () { // 這里用對象來模擬集合 var items = {} }
集合要實現(xiàn)以下方法:
add(value):向集合添加新的項
remove(value):從集合刪除一項
has(value):如果集合中存在該項則返回true,否則返回false
clear():清除集合中的所有項
size():返回集合包含元素的數(shù)量
values():返回集合中所有值的數(shù)組
實現(xiàn)has根據(jù)hasOwnProperty判斷該元素是否屬于集合,注意:hasOwnProperty可以檢查屬性是否屬于對象,對于原型鏈上的屬性hasOwnProperty會返回false
this.has = function (value) { return items.hasOwnProperty(value) }實現(xiàn)add
這里添加新的元素到集合中時,首先要保證該元素不存在于集合中。
this.add = function (value) { if (!this.has(value)) { items[value] = value return true } return false }實現(xiàn)remove
刪除前也要先判斷元素是否存在
this.remove = function (value) { if (this.has(value)) { delete items[value] return true } return false }實現(xiàn)values
Object.keys的作用是返回對象中所有可枚舉屬性組成的數(shù)組(不包括原型鏈上的屬性)。當(dāng)然,你也可以用for...in 來實現(xiàn)。
this.values = function () { return Object.keys(items) }實現(xiàn)clear和size
比較簡單,就直接貼源碼了
this.clear = function () { items = {} } this.size = function () { return Object.keys(items).length }實現(xiàn)集合操作
集合有以下操作:
并集
交集
差集
子集
具體的就不多解釋了,請看代碼
實現(xiàn)并集創(chuàng)建一個新集合unionSet表示兩個集合的并集,之后分別遍歷兩個集合添加進unionSet,最后返回集合
this.union = function (otherSet) { var unionSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { unionSet.add(values[i]) } values = otherSet.values() for (var i = 0; i < values.length; i++) { unionSet.add(values[i]) } return unionSet }實現(xiàn)交集
交集是兩者都有的屬性的集合,實現(xiàn)思路與上面類似,只要判斷元素是否同時存在與兩個集合就行了
this.intersection = function (otherSet) { var intersectionSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { if (otherSet.has(values[i])) { intersectionSet.add(values[i]) } } return intersectionSet }實現(xiàn)差集
差集A-B的意思是:元素只在集合A中存在,集合B中不存在,因此實現(xiàn)也很簡單。
this.difference = function (otherSet) { var differenceSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { if (!otherSet.has(values[i])) { differenceSet.add(values[i]) } } return differenceSet }實現(xiàn)子集
數(shù)學(xué)中A是B的子集意味著A中的所有元素都存在于B中,按照這個思路實現(xiàn)代碼如下
this.subSet = function (otherSet) { if (this.size() > otherSet.size()) { return false } else { var values = this.values() for (var i = 0; i < values.length; i++) { if (!otherSet.has(values[i])) { return false } } return true } }
放上源代碼,有興趣的可以看看:
小結(jié)集合的實現(xiàn)-源代碼
到目前為止,比較簡單的數(shù)據(jù)結(jié)構(gòu)基本都掌握了,后面就是字典、散列表、樹、圖以及排序算法了,都是難啃的骨頭,但是必須要啃下來。繼續(xù)加油~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/87201.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習(xí)。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計劃,將我的短期目標更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:本系列所有文章第一篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹簡單介紹鏈表鏈表一種常見的數(shù)據(jù)結(jié)構(gòu),可 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)...
摘要:小結(jié)實現(xiàn)了字典和哈希表感覺沒有想象中那么困難,當(dāng)然這還是開始。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹 字典 不是新華字典哦,這里的字典也稱作_映射_,是一種數(shù)據(jù)結(jié)構(gòu),跟set集合很相似的一種數(shù)據(jù)結(jié)構(gòu),都可以用來...
摘要:是棧,它繼承于。滿二叉樹除了葉結(jié)點外每一個結(jié)點都有左右子葉且葉子結(jié)點都處在最底層的二叉樹。沒有鍵值相等的節(jié)點。這是數(shù)據(jù)庫選用樹的最主要原因。 在我們學(xué)習(xí)Java的時候,很多人會面臨我不知道繼續(xù)學(xué)什么或者面試會問什么的尷尬情況(我本人之前就很迷茫)。所以,我決定通過這個開源平臺來幫助一些有需要的人,通過下面的內(nèi)容,你會掌握系統(tǒng)的Java學(xué)習(xí)以及面試的相關(guān)知識。本來是想通過Gitbook的...
閱讀 3109·2021-11-02 14:40
閱讀 889·2019-08-30 15:53
閱讀 1347·2019-08-30 15:53
閱讀 3318·2019-08-30 13:53
閱讀 3377·2019-08-29 12:50
閱讀 1197·2019-08-26 13:49
閱讀 1930·2019-08-26 12:20
閱讀 3728·2019-08-26 11:33