let fruits =[newFruit('apple',5.3),newFruit('banana',3.2),newFruit('orange',4.6),newFruit('watermelon',2.5)]
排列算法的javascript实现模板(DSF,最优解in-place)
constpremutation=(elements)=>{let res =[]constswap=(arr,i1,i2)=>[arr[i1],arr[i2]]=[arr[i2],arr[i1]]constdsf=(elements,k =0)=>{let len = elements.length
if(k == len-1){// 如果想从N=4中,取3个的全排 只需要改这个k=3
res.push([...elements.slice(0,k+1)])return}for(let i = k; i < len -1; i++){swap(elements, i, k)// 从剩下[k,...,(len-2)]中 取一个 放到当前k位置dsf(elements, k +1)// dsf继续下一个位置 [k+1,...,(len-2)]swap(elements,i , k)// 为下一个迭代(k+1)做回滚}}dsf(elements)return res
}let premutations =premutation(fruits)
premutations.forEach((e,i)=>console.log(i,...e.map(x=>x.name)))
let fruits =[newFruit('apple',5.3),newFruit('banana',3.2),newFruit('orange',4.6),newFruit('watermelon',2.5)]
组合算法的javascript实现模板(bitmap)
constcombination=(elements)=>{let res =[]let len = elements.length
let counts =1<< len
for(let bitmap =0; bitmap < counts; bitmap++){let set =[]for(let i=0; i < len ; i++){if((1<<i)&bitmap){//对应位为1,怎加入当前集合种
set.push(i)}}// set 只是数组索引的组合,需要转成对应element
res.push(set.map(i=>elements[i]))// 完成一个集合的收集}return res
}let combinations =combination(fruits)
combinations.forEach((e,i)=>console.log(i,...e.map(x=>x.name)))