国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js構(gòu)建二叉樹進(jìn)行數(shù)值數(shù)組的去重與優(yōu)化詳解

2019-11-19 14:06:21
字體:
供稿:網(wǎng)友

前言

本文主要介紹了關(guān)于js構(gòu)建二叉樹進(jìn)行數(shù)值數(shù)組的去重與優(yōu)化的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。

常見兩層循環(huán)實(shí)現(xiàn)數(shù)組去重

let arr = [11, 12, 13, 9, 8, 7, 0, 1, 2, 2, 5, 7, 11, 11, 7, 6, 4, 5, 2, 2]let newArr = []for (let i = 0; i < arr.length; i++) { let unique = true for (let j = 0; j < newArr.length; j++) {  if (newArr[j] === arr[i]) {   unique = false   break  } } if (unique) {  newArr.push(arr[i]) }}console.log(newArr)

構(gòu)建二叉樹實(shí)現(xiàn)去重(僅適用于數(shù)值類型的數(shù)組)

將先前遍歷過的元素,構(gòu)建成二叉樹,樹中每個(gè)結(jié)點(diǎn)都滿足:左子結(jié)點(diǎn)的值 < 當(dāng)前結(jié)點(diǎn)的值 < 右子結(jié)點(diǎn)的值

這樣優(yōu)化了判斷元素是否之前出現(xiàn)過的過程

若元素比當(dāng)前結(jié)點(diǎn)大,只需要判斷元素是否在結(jié)點(diǎn)的右子樹中出現(xiàn)過即可

若元素比當(dāng)前結(jié)點(diǎn)小,只需要判斷元素是否在結(jié)點(diǎn)的左子樹中出現(xiàn)過即可

let arr = [0, 1, 2, 2, 5, 7, 11, 7, 6, 4,5, 2, 2]class Node { constructor(value) {  this.value = value  this.left = null  this.right = null }}class BinaryTree { constructor() {  this.root = null  this.arr = [] } insert(value) {  let node = new Node(value)  if (!this.root) {   this.root = node   this.arr.push(value)   return this.arr  }  let current = this.root  while (true) {   if (value > current.value) {    if (current.right) {     current = current.right    } else {     current.right = node     this.arr.push(value)     break    }   }   if (value < current.value) {    if (current.left) {     current = current.left    } else {     current.left = node     this.arr.push(value)     break    }   }   if (value === current.value) {    break   }  }  return this.arr }}let binaryTree = new BinaryTree()for (let i = 0; i < arr.length; i++) { binaryTree.insert(arr[i])}console.log(binaryTree.arr)

優(yōu)化思路一,記錄最大最小值

記錄已經(jīng)插入元素的最大最小值,若比最大元素大,或最小元素小,則直接插入

let arr = [11, 12, 13, 9, 8, 7, 0, 1, 2, 2, 5, 7, 11, 11, 7, 6, 4, 5, 2, 2]class Node { constructor(value) {  this.value = value  this.left = null  this.right = null }}class BinaryTree { constructor() {  this.root = null  this.arr = []  this.max = null  this.min = null } insert(value) {  let node = new Node(value)  if (!this.root) {   this.root = node   this.arr.push(value)   this.max = value   this.min = value   return this.arr  }  if (value > this.max) {   this.arr.push(value)   this.max = value   this.findMax().right = node   return this.arr  }  if (value < this.min) {   this.arr.push(value)   this.min = value   this.findMin().left = node   return this.arr  }  let current = this.root  while (true) {   if (value > current.value) {    if (current.right) {     current = current.right    } else {     current.right = node     this.arr.push(value)     break    }   }   if (value < current.value) {    if (current.left) {     current = current.left    } else {     current.left = node     this.arr.push(value)     break    }   }   if (value === current.value) {    break   }  }  return this.arr } findMax() {  let current = this.root  while (current.right) {   current = current.right  }  return current } findMin() {  let current = this.root  while (current.left) {   current = current.left  }  return current }}let binaryTree = new BinaryTree()for (let i = 0; i < arr.length; i++) { binaryTree.insert(arr[i])}console.log(binaryTree.arr)

優(yōu)化思路二,構(gòu)建紅黑樹

構(gòu)建紅黑樹,平衡樹的高度

有關(guān)紅黑樹的部分,請見紅黑樹的插入

let arr = [11, 12, 13, 9, 8, 7, 0, 1, 2, 2, 5, 7, 11, 11, 7, 6, 4, 5, 2, 2]console.log(Array.from(new Set(arr)))class Node { constructor(value) {  this.value = value  this.left = null  this.right = null  this.parent = null  this.color = 'red' }}class RedBlackTree { constructor() {  this.root = null  this.arr = [] } insert(value) {  let node = new Node(value)  if (!this.root) {   node.color = 'black'   this.root = node   this.arr.push(value)   return this  }  let cur = this.root  let inserted = false  while (true) {   if (value > cur.value) {    if (cur.right) {     cur = cur.right    } else {     cur.right = node     this.arr.push(value)     node.parent = cur     inserted = true     break    }   }   if (value < cur.value) {    if (cur.left) {     cur = cur.left    } else {     cur.left = node     this.arr.push(value)     node.parent = cur     inserted = true     break    }   }   if (value === cur.value) {    break   }  }  // 調(diào)整樹的結(jié)構(gòu)  if(inserted){   this.fixTree(node)  }  return this } fixTree(node) {  if (!node.parent) {   node.color = 'black'   this.root = node   return  }  if (node.parent.color === 'black') {   return  }  let son = node  let father = node.parent  let grandFather = father.parent  let directionFtoG = father === grandFather.left ? 'left' : 'right'  let uncle = grandFather[directionFtoG === 'left' ? 'right' : 'left']  let directionStoF = son === father.left ? 'left' : 'right'  if (!uncle || uncle.color === 'black') {   if (directionFtoG === directionStoF) {    if (grandFather.parent) {     grandFather.parent[grandFather.parent.left === grandFather ? 'left' : 'right'] = father     father.parent = grandFather.parent    } else {     this.root = father     father.parent = null    }    father.color = 'black'    grandFather.color = 'red'    father[father.left === son ? 'right' : 'left'] && (father[father.left === son ? 'right' : 'left'].parent = grandFather)    grandFather[grandFather.left === father ? 'left' : 'right'] = father[father.left === son ? 'right' : 'left']    father[father.left === son ? 'right' : 'left'] = grandFather    grandFather.parent = father    return   } else {    grandFather[directionFtoG] = son    son.parent = grandFather    son[directionFtoG] && (son[directionFtoG].parent = father)    father[directionStoF] = son[directionFtoG]    father.parent = son    son[directionFtoG] = father    this.fixTree(father)   }  } else {   father.color = 'black'   uncle.color = 'black'   grandFather.color = 'red'   this.fixTree(grandFather)  } }}let redBlackTree = new RedBlackTree()for (let i = 0; i < arr.length; i++) { redBlackTree.insert(arr[i])}console.log(redBlackTree.arr)

其他去重方法

通過 Set 對象去重

[...new Set(arr)]

通過 sort() + reduce() 方法去重

排序后比較相鄰元素是否相同,若不同則添加至返回的數(shù)組中

值得注意的是,排序的時(shí)候,默認(rèn) compare(2, '2') 返回 0;而 reduce() 時(shí),進(jìn)行全等比較

let arr = [0, 1, 2, '2', 2, 5, 7, 11, 7, 5, 2, '2', 2]let newArr = []arr.sort((a, b) => { let res = a - b if (res !== 0) {  return res } else {  if (a === b) {   return 0  } else {   if (typeof a === 'number') {    return -1   } else {    return 1   }  } }}).reduce((pre, cur) => { if (pre !== cur) {  newArr.push(cur)  return cur } return pre}, null)

通過 includes() + map() 方法去重

let arr = [0, 1, 2, '2', 2, 5, 7, 11, 7, 5, 2, '2', 2]let newArr = []arr.map(a => !newArr.includes(a) && newArr.push(a))

通過 includes() + reduce() 方法去重

let arr = [0, 1, 2, '2', 2, 5, 7, 11, 7, 5, 2, '2', 2]let newArr = arr.reduce((pre, cur) => {  !pre.includes(cur) && pre.push(cur)  return pre}, [])

通過對象的鍵值對 + JSON 對象方法去重

let arr = [0, 1, 2, '2', 2, 5, 7, 11, 7, 5, 2, '2', 2]let obj = {}arr.map(a => {  if(!obj[JSON.stringify(a)]){    obj[JSON.stringify(a)] = 1  }})console.log(Object.keys(obj).map(a => JSON.parse(a)))

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 忻州市| 黄梅县| 家居| 武陟县| 曲周县| 阜新市| 阿坝| 九江县| 丰镇市| 城口县| 保德县| 东台市| 尼木县| 泰兴市| 靖江市| 合作市| 延津县| 玉田县| 伊金霍洛旗| 云浮市| 遂宁市| 集贤县| 贺兰县| 邻水| 三都| 游戏| 阳谷县| 建昌县| 郎溪县| 宜川县| SHOW| 桓仁| 台中市| 疏勒县| 娄底市| 株洲县| 濮阳县| 上林县| 攀枝花市| 军事| 洪江市|