天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 64|回复: 0

C++ 蓄水池算法

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
蓄水池算法
对于一个未知大小的数据流,随机取k个数据,要求选取的概率相等;
证明:1 先按顺序取k个数 ,每个数都是1/i,i从1到k;
2 然后在第 k+1 个数时,以 k / (k+1) 的概率决定替换;
3 随机选择先前池子中的一个数,与第k+1 个数进行替换,即 1/k * k/(k+1) = 1/(k+1);
最终保证 每个数 都是 以 1/n 的概率选取;

struct ListNode {
    int val;
    ListNode* next;
    ListNode():val(0),next(nullptr){}
    ListNode(int x) :val(x), next(nullptr) {}
};

int main()
{
    ListNode* head = new ListNode(1);
    ListNode* node = head;
    int n = 100, k = 10;
    for (int i = 2; i < n; i++) {
        ListNode* tmp = new ListNode(i);
        node->next = tmp;
        node = node->next;
    }

    vector<int> res;
    for (int i = 0; i < k; i++) {
        res.push_back(head->val);
        head = head->next;
    }
    int i = k;
    while(head){
        int r = rand() % (i+1);
        if (r < k) {
            res[rand() % k] = head->val;
        }
        head = head->next;
        i++;
    }

    for (auto x : res) cout << x << " ";
    return 0;
}

 

 

 

 

C++  蓄水池算法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:24 , Processed in 0.165041 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表