js计算事件数发生的期望

36 阅读2分钟

先计算各个独立事件1件事情、2件事情、3件事情直到N件事情的概率,

let eachP = [1/4,1/2,1/2]
function getE(eachP){
    let res = 0 , n = eachP.length
    function getZuHe(m){
        let used = []  , all = []
        function dfs(path,index){
            if(path.length === m){
                all.push(path.slice())
                return;
            }
            for(let i = index ; i < n ; i ++){
                if(used[i]) continue;
                path.push(i)
                used[i] = true
                dfs(path,i)
                path.pop()
                used[i] = false
            }
        }
        dfs([],0)
        return all
    }
    function getP (m){ //传入的参数表示发生m件事情的概率
        let eachE  = 0
        //n个里面m个的组合
        if(m === 0){
            for(let i = 0 ; i < eachP.length ; i++){
                eachE *= (1 - eachP[i])
            }
            return eachE
        }
        let zuhe = getZuHe(m) ; 
        // console.log(getZuHe(m))
        let eachPIndexArr = [];
        for(let i = 0  ; i < n ; i ++){
            eachPIndexArr.push(i)
        }
        for(let i = 0 ; i < zuhe.length ; i ++){
            // console.log(zuhe[i])
            let  eachNumP = 1 , eachZuHe = zuhe[i]
            for(let j = 0 ; j < eachZuHe.length ; j ++){
                // console.log('you:',eachP[j]) //注意下标
                // console.log('you:',eachP[eachZuHe[j]])
                eachNumP *= eachP[eachZuHe[j]]
            }
            //如何快速比较 zuhe 和 p ,得到zuhe中不存在的数,
            //数字有重复,所以比较下标
            const numLeft = eachPIndexArr.filter(item => !eachZuHe.includes(item))
            
            for(let k = 0 ; k < numLeft.length ; k ++){
                // console.log('meiyou:',1-eachP[numLeft[k]])
                eachNumP *= (1-eachP[numLeft[k]])
            }
            // console.log(eachNumP)
            eachE += eachNumP
        }
        // console.log(eachE)
        return eachE
    }
    for(let i = 0 ; i <= n ; i ++){
        // console.log(i * getP (i))
        res += i * getP (i)
    }
    // console.log(1 * getP (1))
    console.log(res)
    // getP(1)
}
getE(eachP)

遇到的主要问题

n个里面m个的组合 -dfs

如何快速比较两个数组zuhe和p,得到zuhe中不存在的数 - 用.filter()方法,数字是有重复的,所以我用的下标比较。

还有就是当时数组太多,循环遍历使用的时候没有更新为最新数组加下标,而是只写了下标之类的犯错查找问题,检查结果才发现。

快速得到'Z'的ASCII值

c++ 里面可以 'Z'-'A' js

console.log('Z'-'A') //NaN

.charCodeAt()

console.log('Z'.charCodeAt());

有机会用一下bfs

//无向图
//只能跨国一次
//目前求得最短路径和 
function func(input){
    let inputArray = input;
    let n = parseInt(inputArray[0]),m = parseInt(inputArray[1]),aroad = [],broad=[]
    let ipt3 = inputArray[2]
    for(let i = 1 ; i <= ipt3.length ; i ++){
        if(ipt3[i-1] != 'B'){
            aroad.push(i)
        }else broad.push(i)
    }
  //  console.log(aroad)
   // console.log(broad.includes(1))
    
    let adj =  [] 
    let data = Array.from({length:n+1}).map(()=>Array(n+1)) , cArr = Array.from({length:n+1}).map(()=>Array(n+1))
   //console.log(data)
    for(let i = 3 ; i <inputArray.length ; i ++){
        let line = inputArray[i].split(' ')
        let one = parseInt(line[0]) , two = parseInt(line[1]) , distance = parseInt(line[2]) , cost = parseInt(line[3])
        
        if(adj[one])  adj[one].push(two)
        else  adj[one] = [two]
       if(adj[two])  adj[two].push(one)
        else  adj[two] = [one]
       // console.log(one,two,distance)
            data[one][two] = distance
            data[two][one] = distance
        cArr[two][one] = cost
        cArr[one][two] = cost 
        
    }
    let resd = Infinity ,resc = Infinity
    let used = [1] , flag = 0 //默认还没跨国
    let curDistance = 0
    function dfs(curIndex,path){
        if(curIndex == n){
            console.log(path,curDistance)
            resd = Math.min(resd,curDistance)
            return;
        }
        for(let i = 0 ; i < adj[curIndex].length ; i ++){
             let from = curIndex , to = adj[curIndex][i]
             
            if(used[to] ) continue;
            console.log(flag)
            if(aroad.includes(from) && broad.includes(to) || aroad.includes(to) && broad.includes(from)) {
                flag ++ 
            }
            if(flag > 2) continue; 
            path.push(to)
             used[to] = true
            curDistance += data[from][to]
            dfs(to,path)
            used[to] = false
            path.pop()
            curDistance -= data[from][to]
             if(aroad.includes(from) && broad.includes(to) || aroad.includes(to) && broad.includes(from)) {
                flag --
            }
        }
    }
    dfs(1,[1])
    console.log(resd)
   
};
let ipt = [
    '5',
    '5',
    'AABBB',
    '1 3 200 1',
    '2 3 150 3',
    '3 4 170 1',
    '4 5 170 2',
    '2 5 160 1'
]
func(ipt)