美文网首页
算法题目7:从若干数据里取前N个最大的值

算法题目7:从若干数据里取前N个最大的值

作者: 玲儿珑 | 来源:发表于2021-03-20 22:37 被阅读0次

    题目:有一亿多个值,去最大的一万个值,要求时间复杂度最小

    实现:

    // topk find the top k elements of nums
    function topk(nums, k){
      if(nums.length <= k) {
        nums.sort((a,b)=>b-a);
        return nums;
      }
      
      let top = nums.slice(0,k);
      top.sort((a,b)=>b-a);
      for (let n of nums.slice(k)) {
        // search n's index in top
        let idx = binary_search(top, n);
        if (idx>=k) continue;
        // move numbers after idx backwards and drop the last one
        for (let j = top.length-1; j > idx; j--) {
          top[j] = top[j-1];
        }
        // insert n
        top[idx] = n;
      }
      return top;
    }
    // binary_search search num's insert position
    function binary_search(sorted_nums, num) {
      let m = 0;
      let n = sorted_nums.length-1;
      while (m<=n) {
        let k = Math.floor((m+n)/2);
        
        if (num <= sorted_nums[k]) {
          m = k+1;
        } else {
          n = k-1;
        }
        
      }
      return m;
    }
    
    function createNums(N) {
        let nums = [];
        for (let i =0; i < N; i++) {
            let r = Math.floor(Math.random()*1000)
            nums.push(r)
        }
        console.log(nums)
        return nums
    }
    
    topk(createNums(20), 6)
    

    单元测试:

    function unit_test() {
        const N = 20;
        let nums = [];
        let sorted_nums = [];
        for (let i =0; i < N; i++) {
            let r = Math.floor(Math.random()*1000)
            nums.push(r)
            sorted_nums.push(r)
        }
        sorted_nums.sort((a,b)=>b-a)
        
        
        // test 100 times
        let errors = 0;
        let success = 0;
        let total = 100;
        for (let i = 0; i < total; i++ ) {
            
            let k = Math.floor(Math.random()*N)
            let top = topk(nums,k)
            if (top.toString() != sorted_nums.slice(0,k).toString()) {
                errors++
            }else {
                success++
            }
        }
        
        console.log("have", total, "case,", success, "success,", errors, "errors")
    }
    unit_test()
    

    相关文章

      网友评论

          本文标题:算法题目7:从若干数据里取前N个最大的值

          本文链接:https://www.haomeiwen.com/subject/dxygcltx.html