วิธีการพิสูจน์ความถูกต้องของอัลกอริทึมแบบสุ่ม?


24

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

วิธีแรกที่ฉันใช้คือการสร้างรายการทั้งหมดขององค์ประกอบแล้วทำการสับเปลี่ยนมัน (พูดสับเปลี่ยน Fisher-Yates) วิธีที่สองเป็นวิธีการวนซ้ำซึ่งเก็บรายการที่สับในทุกการแทรก ในโค้ดหลอกฟังก์ชันการแทรกคือ:

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

ฉันสนใจที่จะแสดงความเป็นธรรมของการสับคันนี้โดยเฉพาะ ข้อดีของอัลกอริทึมนี้ซึ่งใช้อยู่ก็เพียงพอแล้วแม้ว่ามันจะไม่ยุติธรรมก็ตาม ในการตัดสินใจว่าฉันต้องการวิธีประเมินความเป็นธรรมของมัน

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


คุณสามารถทำตัวอย่างทางสถิติในการรันอัลกอริธึมจำนวนมากและเปรียบเทียบกับค่าที่คาดไว้หรือทำการทดสอบแบบสุ่มบางประเภท
Dave Clarke

คุณต้องการทดสอบการกระจาย มันกระจายอย่างสม่ำเสมอหรือเบ้ อย่างไรก็ตามฉันสงสัยว่าคุณจะต้องเรียกใช้หลาย ๆ ครั้ง
Dave Clarke

ฉันไม่ชัดเจนว่าฉันจะทำอย่างไร มันไม่ใช่การสุ่มของเนื้อหาที่ฉันตามมา แต่เป็นการสุ่มของการสั่งซื้อ วิธีการใดที่สามารถวัดการกระจายของการสั่งซื้อได้
edA-qa mort-ora-y

อาฉันโง่ฉันสามารถใช้ชุดอินพุตคงที่และใช้ตำแหน่งสุดท้ายของแต่ละองค์ประกอบเพื่อรับการแจกแจง ถึงกระนั้นฉันก็ชอบการพิสูจน์เชิงตรรกะมากกว่าการจำลอง
edA-qa mort-ora-y

@ edA-qamort-ora-y: ความปรารถนาของคุณคือคำสั่งของฉัน ;)
Raphael

คำตอบ:


22

ก่อนอื่นให้เราทำสองอย่างชัดเจน แต่เป็นข้อสันนิษฐานที่สำคัญ:

  1. _.random_item สามารถเลือกตำแหน่งสุดท้าย
  2. _.random_itemเลือกทุกตำแหน่งที่มีความน่าจะเป็น1}1n+1

เพื่อพิสูจน์ความถูกต้องของขั้นตอนวิธีการของคุณคุณต้องอาร์กิวเมนต์อุปนัยคล้ายกับที่ใช้ที่นี่ :

  • สำหรับรายการซิงเกิลตันมีความเป็นไปได้เพียงทางเดียวเท่านั้นดังนั้นจึงได้รับการคัดเลือกอย่างสม่ำเสมอ
  • สมมติว่ารายการที่มีองค์ประกอบถูกเลือกอย่างสม่ำเสมอ (จากการเรียงสับเปลี่ยนทั้งหมด) แสดงให้เห็นว่ารายการที่มีองค์ประกอบได้รับจากเทคนิคของคุณได้รับการคัดเลือกอย่างสม่ำเสมอn + 1nn+1

จากที่นี่ไปการพิสูจน์นั้นผิด โปรดดูหลักฐานด้านล่างที่ถูกต้อง; ฉันออกจากที่นี่เพราะทั้งความผิดพลาดและขั้นตอนต่อไปนี้ (ซึ่งเป็นเสียง) อาจเป็นการศึกษา

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

πPอีRม.nราคา(L=π)=1n!ผม=1n J=1nราคา(Lผม=J)=1n(1)

โดยที่และเราคิดเพื่อความเรียบง่ายของโน้ตที่เราใส่{ 1 , , n }ลงในรายการn=|L|{1,...,n}

ตอนนี้ให้เราเห็นสิ่งที่เทคนิคของไม่เมื่อใส่องค์ประกอบเซนต์ เราต้องพิจารณาสามกรณี (หลังจากสลับ):n+1

  1. หนึ่งในองค์ประกอบในรายการไม่สลับกันคือและj { 1 , , n }ผม{1,...,n}J{1,...,n}
  2. หนึ่งในองค์ประกอบในรายการสลับกันคือและj { 1 , , n }ผม=n+1J{1,...,n}
  3. องค์ประกอบใหม่คือและj = n + 1ผม{1,...,n+1}J=n+1

สำหรับแต่ละกรณีเราคำนวณความน่าจะเป็นขององค์ประกอบอยู่ที่ตำแหน่งของฉัน ; ทุกคนต้องกลายเป็น1Jผม (ซึ่งเพียงพอเพราะ(1)) ให้pn=11n+1(1)เป็นความน่าจะเป็นขององค์ประกอบn ตัวแรกที่อยู่ในตำแหน่งใด ๆ ในรายการเก่า (สมมติฐานการเหนี่ยวนำ) และps=1พีn=1nnความน่าจะเป็นของตำแหน่งใด ๆ ที่ถูกเลือกโดย(สมมติฐาน 1, 2) โปรดทราบว่า coice ของรายการที่มีองค์ประกอบnและเลือกตำแหน่ง swapเป็นเหตุการณ์อิสระดังนั้นความน่าจะเป็นของปัจจัยเหตุการณ์ร่วมเช่นพีs=1n+1random_itemn

ราคา(Lผม=J,ผม สลับ)=ราคา(Lผม=J)ราคา(ผม สลับ)=พีnพีs

สำหรับ } ตอนนี้สำหรับการคำนวณผม,J{1,...,n}

  1. เราพิจารณาองค์ประกอบเก่าเท่านั้น องค์ประกอบjนั้นอยู่ที่ตำแหน่งiหากว่ามีอยู่ก่อนหน้าการแทรกครั้งล่าสุดและฉันไม่ได้เลือกเป็นตำแหน่งสลับนั่นคือ nJผมผม

    1ราคา(Lผม=J)=พีn(1-พีs)=1nnn+1=1n+1

  2. ที่นี่เราพิจารณาว่าองค์ประกอบเก่าอย่างใดอย่างหนึ่งถูกเปลี่ยนเป็นตำแหน่งสุดท้าย องค์ประกอบจะอยู่ที่ตำแหน่งเก่า ๆ ดังนั้นเราจึงสรุปความน่าจะเป็นทั้งหมดที่jอยู่ที่ตำแหน่งiและiถูกเลือกให้เป็นตำแหน่งสลับนั่นคือJJผมผม

    1ราคา(Ln+1=J)=Σผม=1nพีnพีs=Σผม=1n1n1n+1=1n+1

  3. องค์ประกอบใหม่จะสิ้นสุดที่ตำแหน่งถ้าหากว่าฉันได้รับเลือกให้เป็นตำแหน่งสลับนั่นคือผมผม

    1ราคา(Lผม=J)=พีs=1n+1

ทั้งหมดกลับกลายเป็นอย่างดีกลยุทธ์การแทรกของคุณจะรักษาความสม่ำเสมอ ด้วยพลังของการเหนี่ยวนำที่พิสูจน์ว่าอัลกอริทึมของคุณสร้างการเรียงสับเปลี่ยนแบบสม่ำเสมอ

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


ดังที่สตีเว่นได้กล่าวไว้อย่างถูกต้องในความคิดเห็นหลักฐานข้างต้นเป็นข้อบกพร่องพื้นฐานที่ไม่ถือ; คุณสามารถสร้างการกระจายในชุดการเรียงสับเปลี่ยนที่เติมเต็มทางขวา แต่ไม่ใช่ทางซ้ายมือ¹(1)

ดังนั้นเราจะต้องทำงานกับความน่าจะเป็นของการเรียงสับเปลี่ยนซึ่งกลายเป็นว่าไม่เลวหลังจากทั้งหมด สมมติฐานเกี่ยวกับrandom_itemและโครงสร้างอุปนัยที่ระบุไว้ในตอนต้นของการโพสต์ยังคงอยู่ในสถานที่ที่เราดำเนินการต่อจากที่นั่น ให้แทนรายการหลังจากแทรก{ 1 , , k }แล้วL(k){1,...,k}

ให้เปลี่ยนแปลงโดยพลการของ{ 1 , ... , n + 1 } มันสามารถเขียนได้เฉพาะเป็นπ'PอีRม.n+1{1,...,n+1}

π'=(π(1),π(2),...,π(ผม-1),n+1,π(ผม+1),...,π(n),π(ผม))

πPอีRม.nผม{1,...,n+1}ราคา(L(n)=π)=1n!random_itemผม1n+1πผม

ราคา(L(n+1)=π')=ราคา(L(n)=π)ราคา(ผม สลับ)=1(n+1)!

ซึ่งเราต้องแสดง ด้วยพลังของการเหนี่ยวนำที่พิสูจน์ว่าอัลกอริทึมของคุณสร้างการเรียงสับเปลี่ยนแบบสม่ำเสมอ


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140

4
'สังเกตว่าการเรียงสับเปลี่ยนได้รับการคัดเลือกอย่างสม่ำเสมอหากองค์ประกอบทุกอย่างมีความเป็นไปได้ที่จะอยู่ในตำแหน่งเดียวกัน' - นี่ไม่เป็นความจริง ตัวอย่างเช่นชุดของการเปลี่ยนลำดับสี่บนสี่องค์ประกอบ {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} เป็นไปตามข้อ จำกัด ของคุณ แต่เห็นได้ชัดว่าไม่ใช่ชุดของการเปลี่ยนลำดับทั้งหมด น่าเสียดายที่คุณต้องใช้คุณสมบัติระดับโลกของการเปลี่ยนแปลงของคุณเพราะไม่มีเงื่อนไขในท้องถิ่นเพียงพอที่จะกำหนดความสม่ำเสมอ
Steven Stadnicki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.