亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 11497 | 回復: 29
打印 上一主題 下一主題

洗牌的技巧  關(guān)閉 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-07-31 10:53 |只看該作者 |倒序瀏覽
參看:

如何用shell實現(xiàn)“洗牌”效果?
文本文件隨機取幾萬行怎么。





  1.                                       洗牌的技巧







  2.     洗牌問題:

  3.     洗一副撲克,有什么好辦法?既能洗得均勻,又能洗得快?即相對于一個文件來說怎樣
  4. 高效率的實現(xiàn)亂序排列?

  5.     關(guān)于洗牌問題,其實已經(jīng)有了一個很好的shell解法,這里另外給三個基于AWK的方法,
  6. 有錯誤之處還請不吝指出。



  7. 方法一窮舉:
  8.     類似于窮舉法,構(gòu)造一個散列來記錄已經(jīng)打印行出現(xiàn)行的次數(shù),如果出現(xiàn)次數(shù)多于一
  9. 次則不進行處理,這樣可以防止重復,但缺點是加大了系統(tǒng)的開銷。



  10. awk -v N=`sed -n '$=' data` '
  11. BEGIN{
  12. FS="\n";
  13. RS=""
  14. }
  15. {
  16. srand();
  17. while(t!=N){
  18.   x=int(N*rand()+1);
  19.   a[x]++;
  20.   if(a[x]==1)
  21.     {
  22.         print $x;t++
  23.     }
  24.   }
  25. }
  26. ' data


  27. 方法二變換:
  28.     基于數(shù)組下標變換的辦法,即用數(shù)組儲存每行的內(nèi)容,通過數(shù)組下標的變換
  29. 交換數(shù)組的內(nèi)容,效率好于方法一。


  30. #! /usr/awk

  31. BEGIN{
  32. srand();
  33. }


  34. {
  35. b[NR]=$0;
  36. }


  37. END{

  38. C(b,NR);
  39. for(x in b)
  40.   {
  41.     print b[x];
  42.   }

  43. }


  44. function C(arr,len,i,j,t,x){

  45. for(x in arr)
  46.   {
  47.       i=int(len*rand())+1;
  48.       j=int(len*rand())+1;
  49.       t=arr[i];
  50.       arr[i]=arr[j];
  51.       arr[j]=t;
  52.   }

  53. }




  54. 方法三散列:

  55.     三個方法中最好的。
  56.     利用AWK中散列的特性(詳細請看:info gawk 中的7.x ),只要構(gòu)造一個
  57. 隨機不重復的散列函數(shù)即可,因為一個文件每行的linenumber是獨一無二的,所
  58. 以用:

  59.     隨機數(shù)+每行l(wèi)inenumber    ------對應------>    那一行的內(nèi)容

  60. 即為所構(gòu)造的隨機函數(shù)。
  61.     從而有:


  62.     awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data







  63.     其實大家擔心的使用內(nèi)存過大的問題不必太在意,可以做一個測試:

  64. 測試環(huán)境:
  65. PM 1.4GHz CPU,40G硬盤,內(nèi)存256M的LAPTOP
  66. SUSE 9.3  GNU bash version 3.00.16 GNU Awk 3.1.4

  67. 產(chǎn)生一個五十幾萬行的隨機文件,大約有38M:

  68. od /dev/urandom |dd  count=75000 >data



  69. 拿效率較低的方法一來說:

  70. 洗牌一次所用時間:

  71. time awk -v N=`sed -n '$=' data` '
  72. BEGIN{
  73. FS="\n";
  74. RS=""
  75. }
  76. {
  77. srand();
  78. while(t!=N){
  79.   x=int(N*rand()+1);
  80.   a[x]++;
  81.   if(a[x]==1)
  82.     {
  83.         print $x;t++
  84.     }
  85.   }
  86. }
  87. ' data

  88. 結(jié)果(文件內(nèi)容省略):


  89. real    3m41.864s
  90. user    0m34.224s
  91. sys     0m2.102s


  92. 所以效率還是勉強可以接受的。

  93. 方法二的測試:

  94. time awk -f awkfile datafile

  95. 結(jié)果(文件內(nèi)容省略):

  96. real    2m26.487s
  97. user    0m7.044s
  98. sys     0m1.371s

  99. 效率明顯好于第一個。


  100. 接著考察一下方法三的效率:

  101. time awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data

  102. 結(jié)果(文件內(nèi)容省略):

  103. real    0m49.195s
  104. user    0m5.318s
  105. sys     0m1.301s


  106. 對于一個38M的文件來說已經(jīng)相當不錯了。
  107. 玩的愉快!
復制代碼

評分

參與人數(shù) 1可用積分 +3 收起 理由
r2007 + 3 精品文章

查看全部評分

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
2 [報告]
發(fā)表于 2006-07-31 10:55 |只看該作者
樓主莫非是dbcat的馬甲?

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
3 [報告]
發(fā)表于 2006-07-31 10:57 |只看該作者
dbcat是樓主的馬甲

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
4 [報告]
發(fā)表于 2006-07-31 10:58 |只看該作者
原帖由 waker 于 2006-7-31 10:57 發(fā)表
dbcat是樓主的馬甲

很像很像,dbcatMM很久沒露面了,~

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
5 [報告]
發(fā)表于 2006-07-31 11:02 |只看該作者
隨機不重復的散列函數(shù)即可,因為一個文件每行的linenumber是獨一無二的,所
以用:

    隨機數(shù)+每行l(wèi)inenumber    ------對應------>    那一行的內(nèi)容

即為所構(gòu)造的隨機函數(shù)。

b[rand()NR]
機率非常小,但不能排除重復可能
用 b[rand()" "NR]如何?

論壇徽章:
7
榮譽版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
6 [報告]
發(fā)表于 2006-07-31 11:07 |只看該作者
原帖由 waker 于 2006-7-31 11:02 發(fā)表
隨機不重復的散列函數(shù)即可,因為一個文件每行的linenumber是獨一無二的,所
以用:

    隨機數(shù)+每行l(wèi)inenumber    ------對應------>    那一行的內(nèi)容

即為所構(gòu)造的隨機函數(shù)。

b[rand()NR]
機率非 ...

同樓上觀點一樣
也可用逗號b[rand(),NR],默認是\034字符
散列的思路真棒,贊!

論壇徽章:
0
7 [報告]
發(fā)表于 2006-07-31 11:10 |只看該作者
原帖由 waker 于 2006-7-31 11:02 發(fā)表
隨機不重復的散列函數(shù)即可,因為一個文件每行的linenumber是獨一無二的,所
以用:

    隨機數(shù)+每行l(wèi)inenumber    ------對應------>    那一行的內(nèi)容

即為所構(gòu)造的隨機函數(shù)。

b[rand()NR]
機率非 ...


問世間此山是否最高?天若有情天亦老,愛你愛到忘不了

論壇徽章:
1
榮譽會員
日期:2011-11-23 16:44:17
8 [報告]
發(fā)表于 2006-07-31 11:23 |只看該作者
原帖由 蘇蓉蓉 于 2006-7-31 11:10 發(fā)表


問世間此山是否最高?天若有情天亦老,愛你愛到忘不了

暈~,waker好福氣~  

論壇徽章:
7
榮譽版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07獅子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10雙子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [報告]
發(fā)表于 2006-07-31 11:30 |只看該作者
原帖由 寂寞烈火 于 2006-7-31 11:23 發(fā)表

暈~,waker好福氣~  


曾子曰:機率非常小,但不能排除重復可能
我就是那個重復的
強烈申請和waker同等待遇

論壇徽章:
0
10 [報告]
發(fā)表于 2006-07-31 13:41 |只看該作者
干嘛呢? 干嘛呢~
打情罵翹。  
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP