การกำหนดหมายเลขเฉพาะในเวลาและพื้นที่ (กรณีที่แย่ที่สุด)


10

ระบุว่าA[1..n]เป็นจำนวนเต็มเช่น0A[k]mสำหรับ1knทั้งหมดและการเกิดขึ้นของแต่ละรายการ หมายเลขยกเว้นหมายเลขเฉพาะในA[1..n]เป็นเลขคี่ พยายามค้นหาหมายเลขที่มีเหตุการณ์เป็นเลขคู่

มีอัลกอริทึมΘ(nlogn) : เราจัดเรียงA[1..n]เป็นB[1..n]และแบ่งB[1..n]ออกเป็นหลาย ๆ ชิ้นซึ่งค่าขององค์ประกอบคือ เหมือนกันดังนั้นเราสามารถนับการเกิดขึ้นของแต่ละองค์ประกอบ

ฉันต้องการค้นหาอัลกอริธึมที่แย่ที่สุด - O(n) -time-and- O(n) -space

สมมติว่าm=Ω(n1+ϵ)และϵ>0ดังนั้นการเรียงลำดับของ Radix จึงไม่เป็นที่ยอมรับ ไบนารี Bitwise การดำเนินงานเป็นที่ยอมรับเช่นA[1]xorA[2][2]


คำตอบของ Aryabhata ด้านล่างแสดงให้เห็นว่ากรณีทั่วไปไม่ดี แต่บางทีคุณอาจมีข้อ จำกัด เพิ่มเติม? ง่าย ( แต่ขนาดใหญ่) ข้อ จำกัด จะมีการบังคับใช้ว่ารายการทั้งหมดในอาร์เรย์เป็นO(n)ในขนาด นี่จะให้อัลกอริธึมเชิงเส้นเล็กน้อย
Luke Mathieson

1
@LukeMathieson: ฉันลบคำตอบนั้นเนื่องจากฉันยังไม่มั่นใจว่ากระดาษที่ฉันอ้างจะทำงานโดยไม่มีการดัดแปลงใด ๆ และนอกจากนี้ OP ดูเหมือนจะสนใจเฉพาะในรูปแบบ RAM ราคาเท่ากัน
Aryabhata

@Aryabhata: ฮิฮิ, คำตอบที่ไม่ได้มีแล้ว! จากสิ่งที่น่าสนใจและอาจมีประโยชน์กับแฟรงค์คุณคิดว่าอะไรคือปัญหาในการปรับผลลัพธ์ในเอกสาร อ่านอย่างรวดเร็วแนะนำให้ใช้ แต่เห็นได้ชัดว่าฉันไม่ได้อ่านมัน
ลุคแมททีสัน

@LukeMathieson: ความจริงที่ว่าองค์ประกอบอื่น ๆ ต้องปรากฏจำนวนครั้งแปลกในปัญหาปัจจุบัน ตั้งแต่ผมไขมันต่ำกว่าหลักฐานเกินไป ...
Aryabhata

มันจะน่าสนใจถ้าคุณสนใจในผลลัพธ์ทางทฤษฎีหรือในทางปฏิบัติ จากจุดทฤษฎีในมุมมองของการตอบสนองอย่างรวดเร็วครั้งแรกของฉันคือว่าคุณสามารถเรียงลำดับรายชื่อของจำนวนเต็มเร็วกว่าn) มีความเป็นอัลกอริทึมที่กำหนดโดยฮันที่วิ่งในเวลา สำหรับอัลกอริธึมแบบสุ่มผลลัพธ์ที่ดียิ่งขึ้นก็เป็นที่รู้จักเช่นฮั่นและ Thorup พบอัลกอริทึมเวลาที่คาดหวัง อย่างไรก็ตามฉันคิดว่าปัญหาของคุณไม่ควรมีการเรียงลำดับ O(nlogn)O(loglogn)O(nloglogn)
A.Schulz

คำตอบ:


2

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

  1. ค้นหาสูงสุด - เวลาm=maxAΘ(n)
  2. "จัดสรร" อาร์เรย์[0..m] - เวลา ¹C[0..m]O(1)
  3. ย้ำกว่าและเพิ่มโดยหนึ่งเมื่อใดก็ตามที่คุณพบ x ถ้าเป็นเพิ่มไปยังรายการเชิงเส้นL- เวลาAC[x]A[_]=xC[x]0xLΘ(n)
  4. ย้ำกว่าและหาองค์ประกอบกับแม้กระทั่ง - เวลา(n)LxeC[xe]O(n)
  5. ย้อนกลับx_exe

สรุปทั้งหมดนี้ให้อัลกอริธึมเชิงเส้นเวลาซึ่งอาจใช้หน่วยความจำจำนวนมาก (ในแง่ของการจัดสรร) โปรดทราบว่าความสามารถในการสุ่มเข้าถึงในเวลาคงที่เป็นอิสระจากเป็นสิ่งสำคัญที่นี่Cm

การเพิ่มผูกไว้บนอวกาศนั้นยากกว่าด้วยวิธีนี้ ฉันไม่รู้โครงสร้างข้อมูลพจนานุกรมที่เสนอการค้นหาเวลาคุณสามารถใช้กัญชาตารางที่นี่มีการใช้งานกับคาดว่าการค้นหาเวลา (ขนาดของตารางจำนวนขององค์ประกอบที่เก็บไว้) เพื่อให้คุณสามารถได้รับโดยพลการที่ดีกับพื้นที่เชิงเส้น - ในความคาดหวัง หากค่าทั้งหมดในแผนที่เป็นค่าแฮชเดียวกันคุณจะได้เมาO(n)O(1)O(1+k/n) nkA


  1. บน RAM สิ่งนี้กระทำโดยปริยาย สิ่งที่เราต้องการคือตำแหน่งเริ่มต้นและตำแหน่งสุดท้าย

0

วิธีแก้ปัญหาเล็กน้อยซึ่งใช้พื้นที่คือการใช้แผนที่แฮช จำได้ว่าแผนที่แฮชตัดจำหน่ายรันไทม์สำหรับการเพิ่มและค้นหาองค์ประกอบΘ(n)O(1)

ดังนั้นเราสามารถใช้อัลกอริทึมต่อไปนี้:

  1. จัดสรรแผนที่กัญชาHย้ำกว่า สำหรับแต่ละองค์ประกอบ , เพิ่มจำนวนของการปรากฏเห็นคือHHAiAH(i)++

  2. วนซ้ำชุดคีย์ของแผนที่แฮชและตรวจสอบว่ามีปุ่มใดบ้างที่มีจำนวนครั้งที่ปรากฏ

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


ฉันยังอยากรู้ว่าหากมีอัลกอริธึมเวลาที่ไม่สุ่มโดยใช้พหุนาม โดยเฉพาะอย่างยิ่งมีหลักฐานทางทฤษฎีว่าการค้นพบสิ่งที่เกิดขึ้นเพียงอย่างเดียวนั้นยากกว่าการค้นหาสิ่งที่เกิดขึ้นเพียงอย่างเดียวหรือไม่? O(n)
A.Schulz

@ A. Schulz ฉันคิดว่ามันเป็น - อัลกอริทึมเวลาที่คาดหวังโดยใช้ตารางแฮช ฉันจำได้ว่ามีใครบางคนบอกฉันว่าอัลกอริทึม (หรือสำหรับกรณีพิเศษพูดคี่ = 1 และแม้ = 2) อาจมีสแต็ก แต่ฉันจำไม่ได้ O(n)O(n)
Yai0Phah

การใช้งาน hashtable ไม่ได้มีคุณสมบัตินี้ทุกตัว โดยปกติการค้นหาไม่ใช่ , ไม่ตัดจำหน่ายแม้แต่ (afaik) ในความเป็นจริงการสนทนาก่อนหน้าไม่ได้ให้การดำเนินการใด ๆ ที่มีการค้นหาเวลาคงที่ คุณจะเจาะจงมากขึ้นได้ไหม? O(1)
กราฟิลส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.