亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

js構建二叉樹進行數值數組的去重與優化詳解

2024-05-06 16:43:20
字體:
來源:轉載
供稿:網友

前言

本文主要介紹了關于js構建二叉樹進行數值數組的去重與優化的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

常見兩層循環實現數組去重

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)

構建二叉樹實現去重(僅適用于數值類型的數組)

將先前遍歷過的元素,構建成二叉樹,樹中每個結點都滿足:左子結點的值 < 當前結點的值 < 右子結點的值

這樣優化了判斷元素是否之前出現過的過程

若元素比當前結點大,只需要判斷元素是否在結點的右子樹中出現過即可

若元素比當前結點小,只需要判斷元素是否在結點的左子樹中出現過即可

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)

優化思路一,記錄最大最小值

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

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)

優化思路二,構建紅黑樹

構建紅黑樹,平衡樹的高度

有關紅黑樹的部分,請見紅黑樹的插入

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   }  }  // 調整樹的結構  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() 方法去重

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

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

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)))

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩国产中文| 日本精品视频在线| 国产精品高潮呻吟久久av无限| 在线亚洲男人天堂| 亚洲男人天堂网| 91在线精品播放| 日韩国产高清污视频在线观看| 亚洲国产精品va在线| 亚洲激情小视频| 97久久久免费福利网址| xxx一区二区| 国产精品亚洲自拍| 大伊人狠狠躁夜夜躁av一区| 91免费国产视频| 欧美性受xxxx白人性爽| 91香蕉国产在线观看| 国产精品久久久久久婷婷天堂| 午夜精品美女自拍福到在线| 日韩国产高清视频在线| 欧美日韩黄色大片| 亚洲成人精品视频| 国产精品久久久久久久久免费看| 亚洲毛茸茸少妇高潮呻吟| 欧美激情2020午夜免费观看| 这里精品视频免费| 成人午夜高潮视频| 亚洲精品综合精品自拍| 亚洲午夜av电影| 日本国产精品视频| 97成人精品区在线播放| 国产精品亚洲激情| 国产成人av网| 欧美激情伊人电影| 国产免费一区二区三区在线能观看| 日本国产一区二区三区| 亚洲性猛交xxxxwww| 中文字幕欧美日韩在线| 国产精品美女在线观看| 麻豆国产va免费精品高清在线| 日韩成人av网址| 久久久久久亚洲精品不卡| 亚洲最新av在线| 日韩欧美精品在线观看| 日韩av影视综合网| 久久深夜福利免费观看| 欧美精品videos另类日本| 国产成人精品免费久久久久| 亚洲国产精彩中文乱码av在线播放| 欧美精品免费看| 国产精品九九久久久久久久| 亚洲欧美在线x视频| 欧美精品久久久久久久| 亚洲精品欧美日韩专区| 揄拍成人国产精品视频| 国产97在线观看| 国产男女猛烈无遮挡91| 欧美成人一区二区三区电影| 日韩在线视频线视频免费网站| 国产精品成人观看视频国产奇米| 国产在线视频欧美| 久久久久久久久久久国产| 日韩成人小视频| 欧美片一区二区三区| 欲色天天网综合久久| 国产精品久久久久久五月尺| 成人伊人精品色xxxx视频| 欧美国产日韩一区二区三区| 日韩在线视频观看| 亚洲桃花岛网站| 97在线视频免费看| 日本欧美中文字幕| 欧美成人在线免费视频| 欧美亚洲成人精品| 色777狠狠综合秋免鲁丝| 97国产精品久久| 国产精品久久精品| 亚洲综合在线播放| 在线观看欧美成人| 欧美激情伊人电影| 精品夜色国产国偷在线| 亚洲精品av在线| 欧美一级黄色网| 亚洲成人精品在线| 久久精品国产精品| 91免费在线视频网站| 一区二区三区黄色| 亚洲第一网中文字幕| 一色桃子一区二区| 亚洲国产精久久久久久| 欧美日韩亚洲精品内裤| 一区二区三区 在线观看视| 91久久综合亚洲鲁鲁五月天| 中文字幕日韩精品在线| 性色av一区二区三区免费| 成人久久18免费网站图片| 亚洲第一色中文字幕| 久久精品国产久精国产思思| 国产91色在线|免| 日韩三级成人av网| 久久影院免费观看| 成人国产精品久久久| 中文字幕一区二区三区电影| 日韩电影中文字幕| 伊人精品在线观看| 午夜精品久久久99热福利| 欧美猛交ⅹxxx乱大交视频| 国产精品高潮呻吟久久av无限| 日韩欧美在线观看| 精品亚洲一区二区三区在线观看| 欧美午夜xxx| 欧美成人精品在线| 中文字幕在线观看日韩| 久久久亚洲福利精品午夜| 国产精品偷伦一区二区| 欧美在线视频一区| 亚洲色图狂野欧美| 国产va免费精品高清在线观看| 97视频在线免费观看| 亚洲欧美综合v| 欧美日韩亚洲视频| 国产亚洲欧美一区| 欧美高清videos高潮hd| 91色在线视频| 亚洲伊人一本大道中文字幕| 亚洲专区中文字幕| 丁香五六月婷婷久久激情| 欧美影院成年免费版| 亚洲精品美女在线观看| 中文字幕日韩综合av| 国产午夜精品视频免费不卡69堂| 欧美最顶级丰满的aⅴ艳星| 国产主播精品在线| 色综合久久88| 欧美人交a欧美精品| 成人淫片在线看| 国产精品高清免费在线观看| 性色av一区二区三区免费| 最近2019中文字幕大全第二页| 综合136福利视频在线| 日韩av综合网站| 日韩欧美999| 日本精品免费观看| 亚洲va码欧洲m码| 国产色婷婷国产综合在线理论片a| 欧美一区二区色| 国产免费一区二区三区在线观看| 在线视频欧美日韩精品| 亚洲高清福利视频| 日韩美女在线看| 日韩av男人的天堂| 中文字幕av一区中文字幕天堂| 国产成人精品久久亚洲高清不卡| 色综合老司机第九色激情| 久久久国产在线视频| 亚洲图中文字幕| 亚洲最新在线视频| 国产精品美女在线观看| 欧美黄色性视频| 热久久这里只有精品| 国产视频在线观看一区二区| 91精品国产91久久久| 精品在线观看国产| 成人网址在线观看| 色播久久人人爽人人爽人人片视av|