zoukankan      html  css  js  c++  java
  • js堆

     

    class Heap{
      constructor(data){
        this.data=data
      }
      sort(){
        let iArr=this.data
        let n=iArr.length
        if(n<=1){
          return iArr
        }else{
          for(let i=Math.floor(n/2);i>=0;i--){
            Heap.maxHeapify(iArr,i,n)
          }
          for(let j=0;j<n;j++){
            Heap.swap(iArr,0,n-1-j)
            Heap.maxHeapify(iArr,0,n-1-j-1)
          }
          return iArr
        }
      }
      
      // 交换两个元素
      static swap(arr,a,b){
        if(a===b) return ''
        let c=arr[a]
        arr[a]=arr[b]
        arr[b]=c
      }
      //构建最大堆的过程
      static maxHeapify(Arr,i,size){
        //左节点(索引)
        let l= i * 2 + 1
        //右节点
        let r=i*2+2
        let largest=i //默认指向父节点
        //父节点i和左节点l做比较取最大
        if(l<=size && Arr[l] > Arr[largest]){
          largest=l
        }
        //右节点和最大值比较
        if(r<=size && Arr[r] >Arr[largest]){
          largest=r
        }
        if(largest!==i){
          Heap.swap(Arr,i,largest)
          Heap.maxHeapify(Arr,largest,size)
        }
      }
    }
    
    export default Heap
    

      

     

      

    class Heap{
      constructor(str){
        let map=new Map()
        str.split('').forEach(item=>{
          if(map.has(item)){
            map.set(item,map.get(item)+1)
          }else{
            map.set(item,1)
          }
        })
        this.map=map
        this.data=Array.from( map.values())
      }
      sort(){
        let iArr=this.data
        let n=iArr.length
        if(n<=1){
          return iArr
        }else{
          for(let i=Math.floor(n/2);i>=0;i--){
            Heap.maxHeapify(iArr,i,n)
          }
          for(let j=0;j<n;j++){
            Heap.swap(iArr,0,n-1-j)
            Heap.maxHeapify(iArr,0,n-1-j-1)
          }
          return iArr
        }
      }
      
      toString(){
        let arr=this.sort()
        let str=[]
        while(arr.length){
          let top=arr.pop()
          for(let [k,v] of this.map){
            if(v===top){
              str.push(k.repeat(v))
              this.map.delete(k)
              break
            }
          }
        }
        return str.join('')
      }
      // 交换两个元素
      static swap(arr,a,b){
        if(a===b) return ''
        let c=arr[a]
        arr[a]=arr[b]
        arr[b]=c
      }
      //构建最大堆的过程
      static maxHeapify(Arr,i,size){
        //左节点(索引)
        let l= i * 2 + 1
        //右节点
        let r=i*2+2
        let largest=i //默认指向父节点
        //父节点i和左节点l做比较取最大
        if(l<=size && Arr[l] > Arr[largest]){
          largest=l
        }
        //右节点和最大值比较
        if(r<=size && Arr[r] >Arr[largest]){
          largest=r
        }
        if(largest!==i){
          Heap.swap(Arr,i,largest)
          Heap.maxHeapify(Arr,largest,size)
        }
      }
    }
    
    export default Heap
    

      

     

     普通数组查找实现:

    class Ugly{
    constructor(n,primes){
      this.n=n
      this.primes=primes
    }
    getAll(){
      //超级丑树列表
      let res=[1]
      let i=2
      let primes=this.primes
      while(res.length<this.n){
        let arr=Ugly.getPrimes(i)
        let k=0
        let l=arr.length
        for(;k<l;k++){
          if(!primes.find(item=>item===arr[k])) break
        }
        // k===l有两种情况1.就是当前这个数压根质因数 3
        //2.所有质因数都在指定列表中
        if(k===l){
          if(l===0){
             if(primes.find(item=>item===i)){
               res.push(i)
             }
          }else{
            res.push(i)
          }
        }
        i++
      }
      return res[this.n-1]
    }
      //计算指定正整数n的质因数 
    static getPrimes(n){
      let prime=(n)=>{
           //存储所有的质因数
        let arr=[]
        for(let i=2;i<n/2+1;i++){
          if(n%i===0&&!prime(i).length){
               arr.push(i)
          }
           }
           return arr
         }
         return prime(n)
      }
    }
    export default Ugly
    

      堆实现:

    class Ugly{
    constructor(n,primes){
      this.n=n
      this.primes=new Heap(primes)
    }
    getAll(){
      //超级丑树列表
      let res=[1]
      let i=2
      let primes=this.primes
      while(res.length<this.n){
        let arr=Ugly.getPrimes(i)
        let k=0
        let l=arr.length
        for(;k<l;k++){
          if(!primes.find(arr[k])) break
        }
        // k===l有两种情况1.就是当前这个数压根质因数 3
        //2.所有质因数都在指定列表中
        if(k===l){
          if(l===0){
             if(primes.find(i)){
               res.push(i)
             }
          }else{
            res.push(i)
          }
        }
        i++
      }
      return res[this.n-1]
    }
      //计算指定正整数n的质因数 
    static getPrimes(n){
      let prime=(n)=>{
           //存储所有的质因数
        let arr=[]
        for(let i=2;i<n/2+1;i++){
          if(n%i===0&&!prime(i).length){
               arr.push(i)
          }
           }
           return arr
         }
         return prime(n)
      }
    }
    export default Ugly
    
    
    
    class Heap{
      constructor(arr){
        this.data=arr
        this.max=arr.length
        this.sort()
      }
    
      sort(){
        let iArr=this.data
        let n=iArr.length
        if(n<=1){
          return iArr
        }else{
          for(let i=Math.floor(n/2);i>=0;i--){
            Heap.maxHeapify(iArr,i,n)
          }
          return iArr
        }
      }
    
      find(val,i=0){
         let arr=this.data
         if(val>arr[i]||i>this.max){
           return false
         }else if(val===arr[i]){
           return val
         }else{
           return this.find(val,i*2+1)||this.find(val,i*2+2)
         }
      }
    }
    
    export {
      Heap
    }
    

      

  • 相关阅读:
    Siege 3.0 正式版发布,压力测试工具
    Pomm 1.1.2 发布,专为 PG 设计的 ORM 框架
    Whonix 0.5.6 发布,匿名通用操作系统
    国内开源 java cms,Jspxcms 2.0 发布
    EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
    GNU Guile 2.0.9 发布,Scheme 实现
    jdao 1.0.4 发布 轻量级的orm工具包
    OpenSearchServer 1.4 RC4 发布
    Percona Server for MySQL 5.5.3030.2
    Samba 4.0.5 发布
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/13586472.html
Copyright © 2011-2022 走看看