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
}

浙公网安备 33010602011771号