จำนวนที่คาดว่าจะโยนเหรียญเพื่อให้ N ติดต่อกันตามลำดับ M


10

สัมภาษณ์มี CodeSprint ที่สองของพวกเขาในเดือนมกราคมที่รวมคำถามด้านล่าง คำตอบแบบเป็นโปรแกรมจะโพสต์ แต่ไม่มีคำอธิบายทางสถิติ

(คุณสามารถดูปัญหาดั้งเดิมและวิธีแก้ปัญหาที่โพสต์ได้โดยลงชื่อเข้าใช้เว็บไซต์ Interviewstreet ด้วยเครดิต Google จากนั้นไปที่ปัญหา Coin Tosses จากหน้านี้)

โยนเหรียญ

คุณมีเหรียญที่ไม่ฝักใฝ่ฝ่ายใดซึ่งคุณต้องการที่จะโยนต่อไปจนกว่าจะได้รับ N หัวติดต่อกัน คุณได้โยนเหรียญ M ครั้งและน่าประหลาดใจการโยนทั้งหมดทำให้เกิดหัว

จำนวนที่ต้องการเพิ่มเติมของการโยนจนกว่าคุณจะได้รับ N หัวติดต่อกันคืออะไร?

อินพุต:
บรรทัดแรกมีจำนวนเคส T แต่ละบรรทัด T ถัดไปมีสองตัวเลข N และ M

เอาต์พุต:
บรรทัดเอาต์พุต T ที่มีคำตอบสำหรับกรณีทดสอบที่สอดคล้องกัน พิมพ์คำตอบที่ถูกปัดเศษเป็นทศนิยม 2 ตำแหน่ง

ตัวอย่างอินพุต:
4
2 0
2 1
3 3
3 2

ตัวอย่างผลลัพธ์:
6.00
4.00
0.00
8.00

คำอธิบายตัวอย่าง:
ถ้า N = 2 และ M = 0 คุณจะต้องโยนเหรียญต่อไปจนกว่าคุณจะได้รับ 2 หัวติดต่อกัน ไม่ยากที่จะแสดงให้เห็นว่าโดยทั่วไปจำเป็นต้องมีการโยนเหรียญ 6 ครั้ง
ถ้า N = 2 และ M = 1 คุณต้องการ 2 หัวติดต่อกันและมี 1 แล้วคุณต้องโยนอีกครั้งไม่ว่าจะเกิดอะไรขึ้น ในการโยนครั้งแรกถ้าคุณได้รับหัวคุณจะทำ มิฉะนั้นคุณจะต้องเริ่มต้นใหม่เนื่องจากตัวนับที่ต่อเนื่องจะถูกรีเซ็ตและคุณจะต้องโยนเหรียญต่อไปจนกว่าคุณจะได้รับ N = 2 หัวติดต่อกัน จำนวนการโยนเหรียญที่คาดหวังจึงเท่ากับ 1 + (0.5 * 0 + 0.5 * 6) = 4.0 ถ้า N = 3 และ M = 3 คุณมี 3 หัวอยู่แล้วดังนั้นคุณไม่จำเป็นต้องทอยอีกต่อไป

สมการทางคณิตศาสตร์ทั้งหมดที่ฉันพบมีคำตอบที่ถูกต้องสำหรับข้อมูลอินพุตตัวอย่างที่แสดงไว้ด้านบน แต่ผิดสำหรับชุดอินพุตอื่นทั้งหมดของพวกเขา (ซึ่งไม่ทราบ) วิธีแก้ปัญหาเชิงโปรแกรมของพวกเขาดูเหมือนจะแก้ปัญหาได้แตกต่างจากวิธีการทดลองแบบสมการของฉัน มีใครช่วยอธิบายวิธีการแก้สมการที่จะแก้ปัญหานี้ได้ไหม


1
ดูที่นี่ที่ซึ่งเราพบผลลัพธ์ให้โดย Daniel Johnson ด้านล่าง 2ยังไม่มีข้อความ+1-2M+1
Dilip Sarwate

คำตอบ:


8

นี้คือการออกกำลังกายการคำนวณจึงคิดซ้ำ สถานะปัจจุบันของเหรียญพลิกจะถูกกำหนดโดยทั้งคู่ได้รับคำสั่งกับN M 0 ปล่อยให้จำนวนที่คาดว่าจะพลิกถึงNหัวต่อเนื่องกันเป็นe ( N , M ) :(ยังไม่มีข้อความ,M)ยังไม่มีข้อความM0ยังไม่มีข้อความอี(ยังไม่มีข้อความ,M)

(1) มีโอกาส 50% ที่การโยนครั้งต่อไปจะนำคุณเข้าสู่สถานะและโอกาส 50% ที่การพลิกครั้งต่อไปจะเป็นการนำคุณไปสู่สถานะ( N , 0 ) . ค่าใช้จ่ายนี้หนึ่งพลิก ดังนั้นความคาดหวัง (ซ้ำ) จะได้รับจาก(ยังไม่มีข้อความ,M+1)(ยังไม่มีข้อความ,0)

อี(ยังไม่มีข้อความ,M)=12อี(ยังไม่มีข้อความ,M+1)+12อี(ยังไม่มีข้อความ,0)+1

(2) เงื่อนไขพื้นฐาน: คุณได้ระบุไว้แล้ว

อี(ยังไม่มีข้อความ,0)=2ยังไม่มีข้อความ+1-2

และแน่นอน

อี(ยังไม่มีข้อความ,ยังไม่มีข้อความ)=0

(ไม่จำเป็นต้องพลิกอีก)

ต่อไปนี้เป็นโปรแกรมMathematica ที่สอดคล้องกัน(รวมถึงการแคชผลลัพธ์ระดับกลางเพื่อเร่งการเรียกซ้ำซึ่งเป็นวิธีแก้ปัญหาการเขียนโปรแกรมแบบไดนามิกที่มีประสิทธิภาพ):

e[n_, m_] /; n > m > 0 := e[n, m] = 1 + (e[n, m + 1] + e[n, 0])/2 // Simplify
e[n_, 0] := 2^(n + 1) - 2
e[n_, n_] := 0

โปรแกรมจะมีลักษณะคล้ายกันในภาษาการเขียนโปรแกรมอื่น ๆ ที่รองรับการเรียกซ้ำ ในทางคณิตศาสตร์เราสามารถตรวจสอบได้ว่าเพียงแค่ตรวจสอบการเรียกซ้ำเนื่องจากเห็นได้ชัดว่าเป็นกรณีฐาน:อี(ยังไม่มีข้อความ,M)=2ยังไม่มีข้อความ+1-2M+1

2ยังไม่มีข้อความ+1-2M+1=1+(2ยังไม่มีข้อความ+1-2M+2+2ยังไม่มีข้อความ+1-2)/2,

ซึ่งเป็นจริงสำหรับและN , QED ใด ๆMยังไม่มีข้อความ


โดยทั่วไปแล้ววิธีการเดียวกันจะกำหนดว่าเมื่อเหรียญมีความน่าจะเป็นpของหัว ส่วนที่ยากคือการทำงานออกสภาพฐานอี(N,0) ซึ่งทำโดยการไล่ล่าการเรียกซ้ำออกไปตามขั้นตอนNจนกระทั่งในที่สุดe(N,0)แสดงออกมาในรูปของตัวเองและการแก้ไข:อี(ยังไม่มีข้อความ,M)=พี-ยังไม่มีข้อความ-พี-M1-พีพีอี(ยังไม่มีข้อความ,0)ยังไม่มีข้อความอี(ยังไม่มีข้อความ,0)

e(N,0)=1+พีอี(ยังไม่มีข้อความ,1)+(1-พี)อี(n,0)=1+พี(1+พีอี(ยังไม่มีข้อความ,2)+(1-พี)อี(ยังไม่มีข้อความ,0))+(1-พี)อี(ยังไม่มีข้อความ,0)=1+พี+พี2++พียังไม่มีข้อความ-1+(1-พี)[1+พี++พียังไม่มีข้อความ-1]อี(ยังไม่มีข้อความ,0);อี(ยังไม่มีข้อความ,0)=1-พียังไม่มีข้อความ1-พี+(1-พียังไม่มีข้อความ)อี(ยังไม่มีข้อความ,0);อี(ยังไม่มีข้อความ,0)=พี-ยังไม่มีข้อความ-11-พี.

1
บางทีการทำงานซ้ำ ๆมากกว่าจะวนซ้ำอาจจะดีกว่าไหม คุณมีซึ่งให้e(N,M+1)=2e(N,M)-2N+1และ e e ( N , 1 )
อี(ยังไม่มีข้อความ,M)=12อี(ยังไม่มีข้อความ,M+1)+12อี(ยังไม่มีข้อความ,0)+1
อี(ยังไม่มีข้อความ,M+1)=2อี(ยังไม่มีข้อความ,M)-2ยังไม่มีข้อความ+1
และอื่น ๆ ให้e(N,M)=2N+1-2M+1 หรือสมการความแตกต่างสามารถแก้ไขได้ "เชิงทฤษฎี" แทนที่จะทำซ้ำ
อี(ยังไม่มีข้อความ,1)=2อี(ยังไม่มีข้อความ,0)-2ยังไม่มีข้อความ+1=2(2ยังไม่มีข้อความ+1-2)-2ยังไม่มีข้อความ+1=2ยังไม่มีข้อความ+1-4อี(ยังไม่มีข้อความ,2)=2อี(ยังไม่มีข้อความ,1)-2ยังไม่มีข้อความ+1=2(2ยังไม่มีข้อความ+1-4)-2ยังไม่มีข้อความ+1=2ยังไม่มีข้อความ+1-8
อี(ยังไม่มีข้อความ,M)=2ยังไม่มีข้อความ+1-2M+1.
Dilip Sarwate

@Dilip การอนุมานที่คุณวาดทั้งที่ "ซึ่งให้" และ "และ" และอื่น ๆ "เป็นแบบเรียกซ้ำ คุณมีวิธีการแก้ปัญหาในใจโดย "แก้ไขในทางทฤษฎี"?
whuber

ในใจของฉันความแตกต่างระหว่างการเรียกซ้ำและการวนซ้ำเป็นวิธีการทำงาน สำหรับความสัมพันธ์ recursionคำนวณx ( n )เป็นx ( n ) = 2 x ( n - 1 ) = 2 ( 2 x ( n - 2 ) ) =
x(n)=2x(n-1),  x(0)=1,
x(n)ในขณะที่การวนซ้ำพูดว่า x ( 0 ) = 1 x ( 1 ) = 2 x ( 0 ) = 2 x ( 2 ) = 2
x(n)=2x(n-1)=2(2x(n-2))=2(2(2x(n-3)))==2(2(2x(0))=2n
"ตามหลักวิชา" หมายถึงการแก้สมการความแตกต่างด้วยการค้นหาพหุนามลักษณะการหาค่ารากของมันจากนั้นจึงปรับแก้ปัญหาทั่วไปให้เข้ากับสภาพเริ่มต้นแทนที่จะทำการคำนวณอย่างง่ายข้างต้น
x(0)=1x(1)=2x(0)=2x(2)=2x(1)=22x(n)=2x(n-1)=22n-1=2n.
Dilip Sarwate

find_x(n)if n=0 return 1 else return 2*find_x(n-1)find_xny = 1; while n > 0 do begin y=2*y; n=n-1 end; return y

ถ้าคุณดูว่าโปรแกรมเหล่านั้นถูกนำไปใช้งานจริงบนคอมพิวเตอร์ @Dilip ได้อย่างไรในหลาย ๆ สภาพแวดล้อม (เช่นR) พวกเขาแทบจะไม่แตกต่างกันเลย (ในกรณีหนึ่งที่คุณสร้างและจากนั้นประมวลผลเวกเตอร์1:nและอีกอันหนึ่งคุณจะค้นพบว่าn:1ถูกวางลงบนสแต็กและประมวลผลแบบย้อนกลับ) แต่ส่วนหนึ่งของประเด็นของฉันคือแนวคิด : ความคิดเห็นเริ่มต้นของคุณพูดว่า ที่อ้างถึงการวิเคราะห์และไม่ใช่โปรแกรมคอมพิวเตอร์ แต่สิ่งเหล่านี้เป็นจุดสัมผัสจุดสัมผัสที่การสนทนาไม่รับประกันการขยายความคิดเห็นหัวข้อนี้
whuber

5

เพื่อแก้ปัญหานี้ฉันจะใช้กระบวนการสุ่มเวลาหยุดและการเขียนโปรแกรมแบบไดนามิก

ก่อนคำจำกัดความบางอย่าง:

Xn#(จากหัวที่ต่อเนื่องกันหลังจากการพลิกที่ n)
X0X0=0XX0=M

τยังไม่มีข้อความนาที{k:Xk=ยังไม่มีข้อความ} และ τ0นาที{k>1:Xk=0}

τยังไม่มีข้อความ(Xτยังไม่มีข้อความ=ยังไม่มีข้อความ)(X0=M)Mยังไม่มีข้อความ

E[τยังไม่มีข้อความ|X0=M]=E[τยังไม่มีข้อความ1{τยังไม่มีข้อความ<τ0}+τยังไม่มีข้อความ1{τยังไม่มีข้อความ>τ0}|X0=M]
=(ยังไม่มีข้อความ-M)(12)ยังไม่มีข้อความ-M+E[τ0|τยังไม่มีข้อความ>τ0,X0=M]+(1-(12)ยังไม่มีข้อความ-M)E[τยังไม่มีข้อความ|X0=0]

ครั้งแรกที่สอดคล้องกับจำนวนที่คาดหวังของการพลิกก่อนที่จะได้รับหางสมมติว่าหางถูกพลิกก่อนที่จะมีการสังเกตหัว N ติดต่อกันโดยสมมติว่าเราเริ่มต้นด้วยหัวต่อเนื่อง M ไม่ยากเกินไปที่จะดูว่า

E[τ0|τยังไม่มีข้อความ>τ0,X0=M]=ΣJ=1ยังไม่มีข้อความ-M(J)(12)J=2-(ยังไม่มีข้อความ-M+2)(12)ยังไม่มีข้อความ-M

ทีนี้สิ่งที่เราต้องทำก็คือคำนวณความคาดหวังตามเงื่อนไขข้อที่สองซึ่งสอดคล้องกับจำนวนการพลิกที่คาดไว้เพื่อสังเกตหัวต่อเนื่อง N เริ่มต้นจาก 0 ด้วยการคำนวณที่คล้ายกันเราเห็นว่า

E[τยังไม่มีข้อความ|X0=0]=E[τยังไม่มีข้อความ1{τยังไม่มีข้อความ<τ0}+τยังไม่มีข้อความ1{τยังไม่มีข้อความ>τ0}|X0=0]
=ยังไม่มีข้อความ(12)ยังไม่มีข้อความ+E[τ0|τยังไม่มีข้อความ>τ0,X0=0]+(1-(12)ยังไม่มีข้อความ)E[τยังไม่มีข้อความ|X0=0]
=2ยังไม่มีข้อความ{ยังไม่มีข้อความ(12)ยังไม่มีข้อความ+(2-(ยังไม่มีข้อความ+2)(12)ยังไม่มีข้อความ)}
=2ยังไม่มีข้อความ+1-2

นี่เป็นคำตอบสุดท้ายของ:

E[τยังไม่มีข้อความ|X0=M]=(ยังไม่มีข้อความ-M)(12)ยังไม่มีข้อความ-M+2-(ยังไม่มีข้อความ-M+2)(12)ยังไม่มีข้อความ-M+(1-(12)ยังไม่มีข้อความ-M)(2ยังไม่มีข้อความ+1-2)
=2ยังไม่มีข้อความ+1-2M+1

สิ่งนี้สอดคล้องกับกรณีทดสอบสี่ข้อที่คุณระบุไว้ ด้วยคำตอบง่ายๆนี้อาจมีวิธีที่ง่ายกว่าในการคำนวณ


1
นี่เป็นวิธีที่ยากกว่าในการแก้ไขมากกว่าแนวคิดแบบเรียกซ้ำตามที่ระบุไว้ข้างต้น แต่มันมีประโยชน์อย่างมากที่จะเห็นทั้งสองวิธีมารวมกัน คนส่วนใหญ่ไม่ชื่นชมวิธีที่การหยุดเวลาสามารถใช้กับปัญหาเล็ก ๆ ได้เช่นกัน
ely

2

คำเตือน: สิ่งต่อไปนี้อาจไม่ถือเป็นคำตอบที่เหมาะสมเนื่องจากไม่ได้ให้วิธีการแก้ปัญหาแบบปิดกับคำถามโดยเฉพาะ เมื่อเทียบกับคำตอบก่อนหน้านี้ อย่างไรก็ตามฉันพบวิธีการที่น่าสนใจพอที่จะหาการกระจายตัวแบบมีเงื่อนไข

ยังไม่มีข้อความk1-พี(ยังไม่มีข้อความ,k)

พี(ยังไม่มีข้อความ,k)={1ถ้า k<ยังไม่มีข้อความΣม.=1ยังไม่มีข้อความ12ม.พี(ยังไม่มีข้อความ,k-ม.)อื่น
ยังไม่มีข้อความkยังไม่มีข้อความยังไม่มีข้อความ

ม.ยังไม่มีข้อความ

     p(N,m-N-1) \dfrac{1}{2^{N+1}} &\text{if } N<m<2N+1
     \end{cases}

ม.-ยังไม่มีข้อความ-1ยังไม่มีข้อความยังไม่มีข้อความม.-ยังไม่มีข้อความ-1

Mยังไม่มีข้อความ ม.ยังไม่มีข้อความ

     0 &\text{if } N<m\le N+M\\

      \dfrac{1}{2^{M}}\sum_{r=M+1}^{N}\dfrac{1}{2^{r-M}}q(N,m-r)&\text{if } N+M<m

Hอีnอีเสื้อชั่วโมงอีโอndผมเสื้อผมโอnaล.พีRโอaผมล.ผมเสื้อYโอWaผมเสื้อผมnก.$ม.$sเสื้ออีพีsเสื้อโอก.อีเสื้อ$ยังไม่มีข้อความ$โอnsอียูเสื้อผมโวลต์อีชั่วโมงอีadsก.ผมโวลต์อีnเสื้อชั่วโมงอีผมRsเสื้อ$M$โอnsอียูเสื้อผมโวลต์อีชั่วโมงอีadsผมs

Tชั่วโมงอีอีxพีอีเสื้ออีdnยูม.อีRโอdRaWsanเสื้อชั่วโมงอีnอีdอีRผมโวลต์อีdY
E(M,ยังไม่มีข้อความ)-M ขั้นตอน ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.