zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第18章:难题——题目3

    2014-04-29 01:02

    题目:从m个整数里随机选出n个整数,要求等概率。

    解法:和洗牌的算法类似,每次随机抽出一个数,抽n次即可。时间复杂度O(m * n),空间复杂度O(m)。

    代码:

     1 // 18.3 pick m integers randomly from an array of n integer.
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <ctime>
     5 #include <vector>
     6 using namespace std;
     7 
     8 void randomSubset(const vector<int> &src, vector<int> &dst, int m)
     9 {
    10     vector<int> v;
    11     int i, j;
    12     int idx;
    13     int n;
    14     
    15     v = src;
    16     n = (int)v.size();
    17     dst.resize(m);
    18     for (i = 0; i < m; ++i) {
    19         idx = rand() % n;
    20         dst[i] = v[idx];
    21         --n;
    22         for (j = idx; j < n; ++j) {
    23             v[j] = v[j + 1];
    24         }
    25     }
    26     v.clear();
    27 }
    28 
    29 int main()
    30 {
    31     int i;
    32     int n, m;
    33     vector<int> src;
    34     vector<int> dst;
    35     int cc;
    36     
    37 
    38     cc = 0;
    39     while (scanf("%d%d", &n, &m) == 2) {
    40         ++cc;
    41         srand((unsigned)(time(NULL) * cc));
    42         src.resize(n);
    43         for (i = 0; i < n; ++i) {
    44             src[i] = i;
    45         }
    46         randomSubset(src, dst, m);
    47         for (i = 0; i < m; ++i) {
    48             printf((i % 8 == 7 ? "%3d
    " : "%3d "), dst[i]);
    49         }
    50         printf("
    ");
    51     }
    52     
    53     return 0;
    54 }
  • 相关阅读:
    bzoj 4610 Ceiling Functi
    uva 01350
    uva 12075
    uva 01393
    uva 11038
    CF 496E
    CF 496D
    poj 3167
    hdu 4622
    spoj 7258
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3698347.html
Copyright © 2011-2022 走看看