Ölçülmüş ehtimalı olan siyahıdan rast gəlmək

Mənim N elementlərim bir sıra var (bu əlifbanın N hərflərini təmsil edir) və arrayın hər bir hüceyrəsi bu mektubun bu mətnində baş verən hadisələrin sayını əks etdirən bir tamsayı dəyəri, tamsayı dəyəri ehtiva edir. Artıq alfabe içərisindəki bütün məktublardan təsadüfi bir şəkildə seçdiyiniz məhdudiyyətlər ilə baş verən hadisələrin sayına görə bir məktub seçmək istərdim:

  • Məktubda müsbət (qeyri-sıfır) dəyər varsa, o zaman həmişə alqoritm ilə seçilə bilər (əlbəttə ki, daha çox və ya daha az ehtimalı ilə).

  • Hərfi hərfi B-dən daha yüksəkdirsə, daha çox alqoritm tərəfindən seçilməlidir.

İndi bunu nəzərə alaraq, bu işi edə biləcək sadə bir alqoritmlə gəldim, amma daha yaxşı bir şey olub-olmadığını maraqlandırdım. Bu, çox əsaslı görünür və mən düşünürəm ki, bunu daha səmərəli etmək üçün daha ağıllı hərəkətlər edilə bilər. Bu düşündüm bir alqoritm:

  • Diziliyə bütün frekansları əlavə edin. SUM'a saxla
  • 0'dan SUM'a təsadüfi bir dəyər seçin. Qaçaraq qorumaq
  • [RAN> 0 ikən, ilkdən başlayaraq, serialın hər bir hüceyrəsini ziyarət edin (sırası ilə) və bu hüceyrənin RAN
  • Son ziyarət edilən hüceyrə seçildi

Yəni, bundan daha yaxşı bir şey varmı? Bir şey əldən vermədimmi?

Mən bilirəm ki, ən müasir kompüterlər bunu tez bir şəkildə hesablaya bilirlər ki, mənim alqoritmim səmərəsiz olub olmadığını anlaya bilməyəcəyəm, buna görə praktikdən daha nəzəri bir sualdır.

Mən cavab alqoritmini təkrar edirəm, cavabın kodu deyil, kodun cavabını verməniz daha rahat olarsa, bununla heç bir problemim yoxdur.

10
22 июня '13 в 15:11 2013-06-22 15:11 Setzer22 22 iyun 'da 15:11' də təyin olunub 2013-06-22 15:11
@ 2 cavablar

Fikir:

  • Bütün elementlər vasitəsilə yineleyin və indiyədək hər bir elementin dəyərini kümülatif bir tezlik kimi təyin edin.
  • 1 və bütün frekansların cəmi arasında təsadüfi bir sıra yaradın.
  • Bu sayının dəyərləri üçün ikili axtarış aparın (nömrədən daha çox və ya bərabər olan ilk dəyəri tapın).

Məsələn:

 Element ABCD Frequency 1 4 3 2 Cumulative 1 5 8 10 

1-10 aralığında təsadüfi bir sıra yaradın (1 + 4 + 3 + 2 = 10, yığışan siyahıdakı son dəyər ilə eyni), dəyərləri aşağıdakı kimi qaytaracaq ikili axtarış aparın:

 Number Element returned 1 A 2 B 3 B 4 B 5 B 6 C 7 C 8 C 9 D 10 D 
12
22 июня '13 в 15:27 2013-06-22 15:27 Cavab 22 İyun '13 'də 15:27' da Dukeling verildi 2013-06-22 15:27

Alias ​​Metodu, O (1) dəyərini yaranan dəyərə salır, lakin hər bir axtarış üçün iki üniforma tələb edir. Əsasən, hər bir sütunda yaradılacaq dəyərlərdən birini, ikinci dəyəri, taxallaşdırma adını və dəyəri və onun aliasları arasında seçim etmək şərti ehtimalını ehtiva edən bir cədvəl yaratmaq. Sütunların bərabər ehtimalı ilə seçmək üçün ilk formanı istifadə edin. Daha sonra, ikinci formanıza əsaslanan bir əsas dəyər və bir taxma adı arasında seçim edin. N (n log n) n dəyərlər üçün etibarlı bir masanın ilk qəbulu üçün yerinə yetirmək tələb olunur, lakin cədvəl tərəfindən tərtib edilən dəyərlər sabit bir zaman yaradır. Əsl həyata keçirmək üçün bu Ruby daşını yükləyə bilərsiniz.

border=0

Digər çox sürətli metod Marsaglia et al. burada təsvir olunur . C-tətbiqləri təmin etdi.

8
22 июня '13 в 20:18 2013-06-22 20:18 Cavab 22 iyun 'da 20:18' də pjs verilir 2013-06-22 20:18