摘要:前言總括本文講解了數(shù)據(jù)結(jié)構(gòu)中的集合概念,并使用實(shí)現(xiàn)了集合。原文博客地址學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)三集合知乎專(zhuān)欄簡(jiǎn)書(shū)專(zhuān)題前端進(jìn)擊者知乎前端進(jìn)擊者簡(jiǎn)書(shū)博主博客地址的個(gè)人博客人生多風(fēng)雨,何處無(wú)險(xiǎn)阻。敬請(qǐng)期待學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)四散列表
前言
總括: 本文講解了數(shù)據(jù)結(jié)構(gòu)中的[集合]概念,并使用javascript實(shí)現(xiàn)了集合。
原文博客地址:學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(三)——集合
知乎專(zhuān)欄&&簡(jiǎn)書(shū)專(zhuān)題:前端進(jìn)擊者(知乎)&&前端進(jìn)擊者(簡(jiǎn)書(shū))
博主博客地址:Damonare的個(gè)人博客
人生多風(fēng)雨,何處無(wú)險(xiǎn)阻。
正文 集合簡(jiǎn)介在上一篇學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(二)——鏈表中我們說(shuō)了鏈表這種數(shù)據(jù)結(jié)構(gòu),但歸根結(jié)底,不論是棧,隊(duì)列亦或是鏈表都是線(xiàn)性結(jié)構(gòu)。他們都是一種很規(guī)矩的數(shù)據(jù)結(jié)構(gòu),就像幼兒園的小朋友排隊(duì)乖乖的站在那不會(huì)動(dòng)一樣。
然而紛雜的數(shù)據(jù)并不會(huì)總是排隊(duì)站在那里,幼兒園小朋友一旦下了課那可就撒歡了,亂糟糟一團(tuán)。可我們的幼兒園老師卻能分辨出這些小朋友,因?yàn)樯叮恳驗(yàn)槊總€(gè)小朋友都在一個(gè)班里,而且每一個(gè)小朋友都有自己的名字。老師自然很容易就找到小朋友了。
而本篇博文要說(shuō)的集合正是一堆亂糟糟的數(shù)據(jù),唯一的共同點(diǎn)是這些數(shù)據(jù)隸屬于同一個(gè)集合,看下百科給出的解釋?zhuān)?/p>
由一個(gè)或多個(gè)元素所構(gòu)成的叫做集合。
此處的元素就是小朋友了,他們所在的集合就是他們的班級(jí)。其實(shí)我們?cè)诟咧械臅r(shí)候也接觸過(guò)集合的概念。那時(shí)候還沒(méi)有套路這個(gè)名詞,單純的歲月,那個(gè)年代對(duì)于集合是這么解釋的:
集合是指具有某種特定性質(zhì)的具體的或抽象的對(duì)象匯總成的集體,這些對(duì)象稱(chēng)為該集合的元素。
然后又是這么分類(lèi)的:
空集:{}
有限集:{a,b,4}
無(wú)限集:{1,2,3,4...}
不過(guò),數(shù)據(jù)結(jié)構(gòu)中集合是沒(méi)有無(wú)限集這個(gè)概念的。再然后那時(shí)候的集合還有這么幾個(gè)特性:
確定性:給定一個(gè)集合,任給一個(gè)元素,該元素或者屬于或者不屬于該集合,二者必居其一,不允許有模棱兩可的情況出現(xiàn)。
互異性:一個(gè)集合中,任何兩個(gè)元素都認(rèn)為是不相同的,即每個(gè)元素只能出現(xiàn)一次。有時(shí)需要對(duì)同一元素出現(xiàn)多次的情形進(jìn)行刻畫(huà),可以使用多重集,其中的元素允許出現(xiàn)多次。
無(wú)序性:一個(gè)集合中,每個(gè)元素的地位都是相同的,元素之間是無(wú)序的。集合上可以定義序關(guān)系,定義了序關(guān)系后,元素之間就可以按照序關(guān)系排序。但就集合本身的特性而言,元素之間沒(méi)有必然的序。
想當(dāng)年哥還是個(gè)數(shù)學(xué)學(xué)霸,如今卻淪落為了一個(gè)碼農(nóng)......真是讓人唏噓啊。咳咳!接著說(shuō):
集合還有這幾種常見(jiàn)的基本操作:
并集
交集
差集
而且我們數(shù)據(jù)結(jié)構(gòu)中的集合基本是也符合高中時(shí)候的數(shù)學(xué)中的概念的。接下來(lái)我們是用ES5來(lái)實(shí)現(xiàn)集合,為啥子這么說(shuō)呢......因?yàn)樵贓S6中已經(jīng)新給出了Set,Map等幾個(gè)集合類(lèi),更加方便快捷的鎖定鍵值對(duì)。
集合的創(chuàng)建首先我們先聲明一個(gè)集合類(lèi):
function(){ var items={}; }
接下來(lái),我們需要給鏈表聲明一些方法:
add(value):向集合添加一個(gè)新的項(xiàng)
remove(value):從集合移除一個(gè)值
has(value):如果值在集合中,返回true,否則返回false
clear():移除集合中的所有項(xiàng)
size():返回集合所包含的元素?cái)?shù)量,與數(shù)組的length屬性相似
values():返回一個(gè)集合中所有值的數(shù)組
union(setName):并集,返回包含兩個(gè)集合所有元素的新集合(元素不重復(fù))
intersection(setName):交集,返回包含兩個(gè)集合中共有的元素的集合、
difference(setName):差集,返回包含所有存在本集合而不存在setName集合的元素的新集合
subset(setName):子集,驗(yàn)證setName是否是本集合的子集
下面是Set類(lèi)的完整代碼:
function Set() { let items = {}; this.add = function(value){ if (!this.has(value)){ items[value] = value; return true; } return false; }; this.delete = function(value){ if (this.has(value)){ delete items[value]; return true; } return false; }; this.has = function(value){ return items.hasOwnProperty(value); //return value in items; }; this.clear = function(){ items = {}; }; /** * Modern browsers function * IE9+, FF4+, Chrome5+, Opera12+, Safari5+ * @returns {Number} */ this.size = function(){ return Object.keys(items).length; }; /** * cross browser compatibility - legacy browsers * for modern browsers use size function * @returns {number} */ this.sizeLegacy = function(){ let count = 0; for(let key in items) { if(items.hasOwnProperty(key)) ++count; } return count; }; /** * Modern browsers function * IE9+, FF4+, Chrome5+, Opera12+, Safari5+ * @returns {Array} */ this.values = function(){ let values = []; for (let i=0, keys=Object.keys(items); iotherSet.size()){ return false; } else { let values = this.values(); for (let i=0; i 下面是ES6版本代碼:
let Set2 = (function () { const items = new WeakMap(); class Set2 { constructor () { items.set(this, {}); } add(value){ if (!this.has(value)){ let items_ = items.get(this); items_[value] = value; return true; } return false; } delete(value){ if (this.has(value)){ let items_ = items.get(this); delete items_[value]; return true; } return false; } has(value){ let items_ = items.get(this); return items_.hasOwnProperty(value); } clear(){ items.set(this, {}); } size(){ let items_ = items.get(this); return Object.keys(items_).length; } values(){ let values = []; let items_ = items.get(this); for (let i=0, keys=Object.keys(items_); iotherSet.size()){ return false; } else { let values = this.values(); for (let i=0; i 后記 集合是一種比較常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),在JS中我們已經(jīng)有了一種類(lèi)似哈希表的東西:Object(對(duì)象)。但現(xiàn)在我們所說(shuō)的集合只是以[value,value]形式存儲(chǔ)數(shù)據(jù),下一節(jié)我們使用[鍵,值]形式存儲(chǔ)數(shù)據(jù),和本文集合的實(shí)現(xiàn)略有不同。敬請(qǐng)期待:[學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(四)——散列表]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91179.html
摘要:至于這三個(gè)的具體概念,可以看圖中集合的實(shí)現(xiàn)首先,創(chuàng)建一個(gè)構(gòu)造函數(shù)。前端路漫漫,且行且歌的前端樂(lè)園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法三集合 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第四篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:筆者作為一位,將工作以來(lái)用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤(pán),此前端知識(shí)點(diǎn)大百科全書(shū)前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專(zhuān)業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫(huà)各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...
摘要:筆者作為一位,將工作以來(lái)用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤(pán),此前端知識(shí)點(diǎn)大百科全書(shū)前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專(zhuān)業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫(huà)各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...
閱讀 3290·2021-09-09 11:39
閱讀 1237·2021-09-09 09:33
閱讀 1139·2019-08-30 15:43
閱讀 555·2019-08-29 14:08
閱讀 1741·2019-08-26 13:49
閱讀 2386·2019-08-26 10:09
閱讀 1553·2019-08-23 17:13
閱讀 2291·2019-08-23 12:57