日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一次遍历等概率选取字符串中的某个字符

發布時間:2025/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一次遍历等概率选取字符串中的某个字符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.chinaunix.net/uid-7921481-id-3022614.html

存在一個等概率的0、1發生器。
給一個文本流,給定一個指定的字符'x',寫一個函數,等概率地返回'x'的一個文本流偏移(就是'x'在字符串中的位置,比如文本為 axbx,那么x的偏移為{1, 3},最后你需要獲得1或者3,概率分別為1/2
假設文本流每個字符1字節)


============================基本問題=========================================
-----------------------------------------------------------------------------
已知等概率的0-1生產器uint make0~1(),求等概率的0~n生產器uint make0~n(uint n)
uint make0~n(uint n)
{
?? //...
?? //make0~1();
?? //...
?? return ?; //
}
具體什么方法使得make0~n最高效還是大家去想吧。。。
這里高效的意思是很快就能夠返回結果。

-----------------------------------------------------------------------------
=============================================================================

【方法一】
設共有N個字符.
for(;;)
{
??? 產生0~N-1的隨機數r
??? if(A[r]=='x') return r;
}

分析:因為0~N-1是等概率的,產生'x'的位置也是等概率的.
缺陷:循環return的概率是R/N (R為'x'的個數)
若N超級大R很小,for循環很難return.


【方法二】
1:vector<uint> a_pos;//從頭到尾記錄'x'出現的位置
2:這里有R==a_pos.size(). 產生0~R-1的隨機數r
3:取a_pos[r]即可。

缺陷:當R很大時空間開銷很大。
比方法一的優勢在于: 這個無須循環一下就可return.


【方法三】
先遍歷一遍字符串,記下有'x'出現的次數為R;
產生0~R-1 的隨機數 r
再遍歷一遍字符串獲取第r個'x'的位置

缺陷:最壞情況要遍歷兩遍字符串
優勢:克服了方法一和二的缺陷


=========面試官會問,還有沒有更好的方法=========================
【方法四】
有沒有只遍歷一遍就OK的方法呢?
直觀的,我們每碰到一個'x',設當前碰到的'x'的位置是i,我們可以以某個概率p去獲取這個
'x'。此時獲取'x'的概率絕對不是1/R,因為我們還不知道R的確切數字呢。
我們仍然需要繼續遍歷i之后的字符串,然后覆蓋之。。。

于是列個方程組(*),獲取第一個的概率是P(1),獲取第i個的概率是P(i),獲取第R個的概率是P(R)
滿足:
P(1)(1-P(2))(1-P(3))...(1-P(R))=1/R
P(2)(1-P(3))...(1-P(R))=1/R
P(3)(1-P(4))...(1-P(R))=1/R
...
P(R-1)(1-P(R))=1/R
P(R)=1/R

上述方程組的思想是:每個字符獲取的概率為1/R,遍歷到它時能獲取它,其后的所有該字符都不會獲取。

求P(i),得:
P(R)=1/R
P(R-1)=1/(R-1)
P(R-2)=1/(R-2)
...
P(2)=1/2
P(1)=1

于是乎,碰到第一個'x'就取,碰到第二個就以1/2的概率去取(若概率發生,就更新當前的'x'的位置),
...第R個'x'就以1/R的概率去取,于是乎完成操作。

優勢:遍歷一遍
缺陷:每碰到一個指定的字符都需要產生相應的隨機數(產生等概率的隨機數的最高效的算法是什么呢?)

注意了:對于一個文本流,在該流沒有流完之前,你不知道該流總共有多少個字符,你也不知道總共有多少個指定的字符,并且只流一次(不會再流一次),因此,方法一和方法三都不行不通。


http://www.cnblogs.com/DeadKnight/archive/2010/06/21/1762190.html

題:
給你一個字符串(可能有幾億個字符),給定一個特殊的字符'a',再給定一個可以產生0和1的隨機數發生器,然后讓你寫一個函數,等概率地返回'a'的一個索引(就是'a'在字符串中的位置,比如字符串為 aaba,那么a的索引為{0, 1, 3},等概率地返回0、1或者3)

想:
最簡單的想法:這個如果產生隨機數,再把該隨機數哈希到字符串長度范圍內,再把得到的哈希值作為下標去看對應的字符滿足不滿足條件,滿足條件則返回下標,不滿足條件的話重新隨機。缺點——如果滿足條件的字符很少,那么完全不靠譜!
稍微容易想到的方法:遍歷這個字符串,對滿足條件的下標建立索引,然后根據索引大小產生隨機數,隨機訪問索引,返回索引所對應的下標值。這個可以有,但是也有明顯缺點——如果滿足條件的字符很多,那么索引很大,占用大量存儲!
最后就是完美的解答了:

答:

#include <sstream> #include <iostream> #include <string> #include <time.h>using namespace std;int given_rand() {return rand() % 2; }unsigned int my_rand() {int i, result;for( i = 0, result = 0 ; i < 32 ; i++ ){result <<= 1;result += given_rand();}return result; }int main() { int index = 0, cnt = 0;stringstream strstring("aabbbaaabbbbabbbbabbbbbbbbbbbaabbbbbbb");int ret = 0;char c;srand(time(NULL));while (strstring >> c){index++;if (c == 'a') {++cnt;int rr = my_rand() % (cnt); if (rr < 1)ret = index;}}cout << ret;return 0; }

總結

以上是生活随笔為你收集整理的一次遍历等概率选取字符串中的某个字符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费一级全黄少妇性色生活片 | 国产又粗又长又大视频 | 初音未来打屁股 | 中文字幕人妻一区二区三区视频 | 亚洲自拍色图 | 国产一区综合 | 国产免费成人在线视频 | 国产日韩一级片 | 特级a级片 | 69综合 | 久久成人网18网站 | 91人人草| 艳母动漫在线播放 | 亚洲+小说+欧美+激情+另类 | 一区二区在线免费看 | 一区影视 | 日本韩国在线播放 | 阿v天堂2014 这里有精品 | 亚洲国产成人一区二区 | 国产真人毛片 | 国产精品99视频 | 久久久香蕉 | 欧美tv| 午夜激情av | 久久精品3| 亚洲色图另类 | 久久久久久久久久久久久久久久久久久 | 日韩福利视频导航 | 亚洲精品一区二三区不卡 | 小少妇哺乳喂奶播放 | 亚洲国产精品99久久久久久久久 | 台湾色综合| 欧美日韩卡一卡二 | 精品一区二区三区入口 | 国产精品传媒视频 | 9久9久9久女女女九九九一九 | 人人九九精品 | 91网站观看 | 淫品色影院 | av日韩一区二区 | 欧美日韩精品久久久 | 蜜桃视频网站 | 麻豆免费电影 | 国产免费一区视频观看免费 | 激情五月色播五月 | 国精产品一区一区三区有限公司杨 | 99精品乱码国产在线观看 | 欧美精品乱码99久久蜜桃 | 九色在线 | 欧美视频你懂的 | 国产精品区二区三区日本 | 欧美激情综合 | 亚洲国产v| 日韩在线视频免费 | 国产亚洲福利 | 国产视频99 | 丰满岳妇伦在线播放 | 青青国产 | 欧美xxxxx少妇 | 亚洲精品成a人 | 男女交性视频播放 | 91在线中文| 熊猫成人网 | 久久午夜国产精品 | 久久久久久av无码免费网站下载 | 久久久久久久久久成人 | 高清欧美性猛交 | 成人免费毛片嘿嘿连载视频 | youjizz亚洲 | 在线视频毛片 | 在线日韩欧美 | 中文无码熟妇人妻av在线 | 国产白浆在线 | 亚洲乱熟女一区二区 | 一区二区毛片 | 国产精品一区二区久久 | www.男人的天堂 | jizz免费在线观看 | 黄色a视频| ,国产精品国产三级国产 | 五月激情婷婷在线 | 黄色三级图片 | 国产在线中文字幕 | 亚洲福利久久 | 无遮挡在线观看 | 精品国产一区二区三区噜噜噜 | 小宵虎南在线观看 | 黄片毛片一级 | 欧美日韩精品一区二区在线观看 | 成人性视频网 | 国产一二三精品 | 国产熟妇一区二区三区aⅴ网站 | 国产美女极度色诱视频www | 国产成人在线精品 | 丁香婷婷九月 | 奇米精品一区二区三区在线观看一 | 久久精品欧美 | 一区二区三区在线观看视频 | 国产黄a三级 |