日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

学习javascript数据结构(三)——集合

發(fā)布時(shí)間:2025/7/25 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习javascript数据结构(三)——集合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

總括: 本文講解了數(shù)據(jù)結(jié)構(gòu)中的[集合]概念,并使用javascript實(shí)現(xiàn)了集合。

  • 原文博客地址:學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(三)——集合
  • 知乎專欄&&簡(jiǎn)書專題:前端進(jìn)擊者(知乎)&&前端進(jìn)擊者(簡(jiǎn)書)
  • 博主博客地址:Damonare的個(gè)人博客

人生多風(fēng)雨,何處無險(xiǎn)阻。

正文

集合簡(jiǎn)介

在上一篇學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(二)——鏈表中我們說了鏈表這種數(shù)據(jù)結(jié)構(gòu),但歸根結(jié)底,不論是棧,隊(duì)列亦或是鏈表都是線性結(jié)構(gòu)。他們都是一種很規(guī)矩的數(shù)據(jù)結(jié)構(gòu),就像幼兒園的小朋友排隊(duì)乖乖的站在那不會(huì)動(dòng)一樣。



然而紛雜的數(shù)據(jù)并不會(huì)總是排隊(duì)站在那里,幼兒園小朋友一旦下了課那可就撒歡了,亂糟糟一團(tuán)。可我們的幼兒園老師卻能分辨出這些小朋友,因?yàn)樯?#xff1f;因?yàn)槊總€(gè)小朋友都在一個(gè)班里,而且每一個(gè)小朋友都有自己的名字。老師自然很容易就找到小朋友了。



而本篇博文要說的集合正是一堆亂糟糟的數(shù)據(jù),唯一的共同點(diǎn)是這些數(shù)據(jù)隸屬于同一個(gè)集合,看下百科給出的解釋:

由一個(gè)或多個(gè)元素所構(gòu)成的叫做集合。

此處的元素就是小朋友了,他們所在的集合就是他們的班級(jí)。其實(shí)我們?cè)诟咧械臅r(shí)候也接觸過集合的概念。那時(shí)候還沒有套路這個(gè)名詞,單純的歲月,那個(gè)年代對(duì)于集合是這么解釋的:

集合是指具有某種特定性質(zhì)的具體的或抽象的對(duì)象匯總成的集體,這些對(duì)象稱為該集合的元素。

然后又是這么分類的:

  • 空集:{}
  • 有限集:{a,b,4}
  • 無限集:{1,2,3,4...}

不過,數(shù)據(jù)結(jié)構(gòu)中集合是沒有無限集這個(gè)概念的。再然后那時(shí)候的集合還有這么幾個(gè)特性:

  • 確定性:給定一個(gè)集合,任給一個(gè)元素,該元素或者屬于或者不屬于該集合,二者必居其一,不允許有模棱兩可的情況出現(xiàn)。
  • 互異性:一個(gè)集合中,任何兩個(gè)元素都認(rèn)為是不相同的,即每個(gè)元素只能出現(xiàn)一次。有時(shí)需要對(duì)同一元素出現(xiàn)多次的情形進(jìn)行刻畫,可以使用多重集,其中的元素允許出現(xiàn)多次。
  • 無序性:一個(gè)集合中,每個(gè)元素的地位都是相同的,元素之間是無序的。集合上可以定義序關(guān)系,定義了序關(guān)系后,元素之間就可以按照序關(guān)系排序。但就集合本身的特性而言,元素之間沒有必然的序。

想當(dāng)年哥還是個(gè)數(shù)學(xué)學(xué)霸,如今卻淪落為了一個(gè)碼農(nóng)......真是讓人唏噓啊。咳咳!接著說:

集合還有這幾種常見的基本操作:

  • 并集
  • 交集
  • 差集

而且我們數(shù)據(jù)結(jié)構(gòu)中的集合基本是也符合高中時(shí)候的數(shù)學(xué)中的概念的。接下來我們是用ES5來實(shí)現(xiàn)集合,為啥子這么說呢......因?yàn)樵贓S6中已經(jīng)新給出了Set,Map等幾個(gè)集合類,更加方便快捷的鎖定鍵值對(duì)。

集合的創(chuàng)建

首先我們先聲明一個(gè)集合類:

function(){var items={}; }

接下來,我們需要給鏈表聲明一些方法:

  • 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類的完整代碼:

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); i<keys.length; i++) {values.push(items[keys[i]]);}return values;};this.valuesLegacy = function(){let values = [];for(let key in items) {if(items.hasOwnProperty(key)) {values.push(items[key]);}}return values;};this.getItems = function(){return items;};this.union = function(otherSet){let unionSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){unionSet.add(values[i]);}values = otherSet.values();for (let i=0; i<values.length; i++){unionSet.add(values[i]);}return unionSet;};this.intersection = function(otherSet){let intersectionSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){if (otherSet.has(values[i])){intersectionSet.add(values[i]);}}return intersectionSet;};this.difference = function(otherSet){let differenceSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){if (!otherSet.has(values[i])){ differenceSet.add(values[i]);}}return differenceSet;};this.subset = function(otherSet){if (this.size() > otherSet.size()){return false;} else {let values = this.values();for (let i=0; i<values.length; i++){if (!otherSet.has(values[i])){ return false;}}return true;}}; }

下面是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_); i<keys.length; i++) {values.push(items_[keys[i]]);}return values;}getItems(){return items.get(this);}union(otherSet){let unionSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){unionSet.add(values[i]);}values = otherSet.values();for (let i=0; i<values.length; i++){unionSet.add(values[i]);}return unionSet;}intersection(otherSet){let intersectionSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){if (otherSet.has(values[i])){intersectionSet.add(values[i]);}}return intersectionSet;}difference(otherSet){let differenceSet = new Set();let values = this.values();for (let i=0; i<values.length; i++){if (!otherSet.has(values[i])){differenceSet.add(values[i]);}}return differenceSet;};subset(otherSet){if (this.size() > otherSet.size()){return false;} else {let values = this.values();for (let i=0; i<values.length; i++){if (!otherSet.has(values[i])){return false;}}return true;}};}return Set2; })();

后記

集合是一種比較常見的數(shù)據(jù)結(jié)構(gòu),在JS中我們已經(jīng)有了一種類似哈希表的東西:Object(對(duì)象)。但現(xiàn)在我們所說的集合只是以[value,value]形式存儲(chǔ)數(shù)據(jù),下一節(jié)我們使用[鍵,值]形式存儲(chǔ)數(shù)據(jù),和本文集合的實(shí)現(xiàn)略有不同。敬請(qǐng)期待:[學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)(四)——散列表]

轉(zhuǎn)載于:https://www.cnblogs.com/jztan/p/6119193.html

總結(jié)

以上是生活随笔為你收集整理的学习javascript数据结构(三)——集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。