องค์ประกอบที่ไม่ซ้ำกันสามารถแก้ไขได้ในเวลาเชิงเส้นที่กำหนด?


9

พิจารณาปัญหาต่อไปนี้:

อินพุต : แสดงของจำนวนเต็มX,Y

เป้าหมาย : พิจารณาว่ามีจำนวนเต็มที่อยู่ในทั้งสองรายการหรือไม่x

สมมติว่าทั้งสองรายการมีขนาดnมีอัลกอริทึมเชิงเส้นเวลาที่กำหนดสำหรับปัญหานี้หรือไม่? คุณสามารถแก้ปัญหานี้ในเวลาแน่นอนโดยไม่ใช้การสุ่มX,YnO(n)

น่าเสียดายที่คุณไม่สามารถสรุปได้ว่าองค์ประกอบลิสต์นั้นเล็กทั้งหมด


ฉันสามารถดูวิธีการแก้ปัญหาในเวลาที่คาดหวังโดยใช้อัลกอริธึมแบบสุ่ม: สุ่มเลือกฟังก์ชันแฮชแบบ 2 สากลเก็บองค์ประกอบของลงใน hashtable (โดยใช้เป็นฟังก์ชันแฮช) แล้วค้นหา แต่ละองค์ประกอบของเพื่อดูว่ามันอยู่ใน hashtable หรือไม่ เวลาทำงานคาดว่าจะเป็น(n) อย่างไรก็ตามฉันไม่เห็นวิธีการค้นหาอัลกอริทึมที่กำหนดค่าโดยใช้เวลาหากคุณพยายามลดขนาดลงและแก้ไขฟังก์ชันแฮชที่ระบุเพียงอย่างเดียวจะมีอินพุตที่แย่ที่สุดซึ่งทำให้โพรซีเดอร์นี้รันในO(n)hXhYO(n)O(n)Θ(n2)เวลา. อัลกอริทึมที่ดีที่สุดที่ฉันสามารถหาได้เกี่ยวข้องกับการเรียงลำดับค่า แต่นั่นไม่ใช่เวลาเชิงเส้น เราสามารถใช้เวลาเชิงเส้นตรงได้หรือไม่?

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

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


Hashtables เป็น O (n log n) ตามที่คุณต้องการจัดการการชน
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersenฉันไม่เห็นว่าคุณได้รับจากที่ใด การใช้ฟังก์ชันแฮชแบบ 2 สากลและตารางแฮชที่มีขนาดเหมาะสมช่วยให้มั่นใจได้ว่าจำนวนการชนของแฮชมีน้อยที่สุด (มีความน่าจะเป็นสูง) ดังนั้นฉันจึงเชื่อว่าเวลาทำงานจะทำได้ ฉันไม่แน่ใจว่าคุณมาจากไหน ; หากคุณไม่ทำอะไรเป็นพิเศษ (เช่นใช้แฮชแบบ 2 สากล) กรณีที่แย่ที่สุดคือเนื่องจากการชน O(n)O(nlgn)O(n2)
DW

มารอยู่ในรายละเอียดนี่คือ "ตารางแฮชขนาดที่เหมาะสม" นี่อาจกลายเป็นเรื่องใหญ่หากคุณไม่ต้องการการชน n-log-n ทั่วไปคือ (ถ้าฉันจำได้อย่างถูกต้อง) สำหรับการจัดการฟังก์ชันการชนกับรายการ
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersenจำนวนการแมปคีย์ที่คาดหวังไปยังที่อยู่เดียวกันนั้นเป็นค่าคงที่ (สำหรับตารางที่ไม่ได้โหลดมากเกินไป) ดังนั้นการจำแนกการชนจึงไม่เกี่ยวข้อง ดูที่นี่ด้วย เหมาะกับกรณีที่เลวร้ายที่สุดถ้าคุณใช้ BST ที่สมดุล (ภายนอก) แทนการแสดงรายการ O(nlogn)
กราฟิลส์

คำตอบ:


1

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

  1. เริ่มแรกบิตทั้งหมดจะไม่ถูกตั้งค่า
  2. ทำซ้ำเกิน X การตั้งค่าบิตที่สอดคล้องกัน
  3. ทำซ้ำการตรวจสอบ Y หากบิตที่สอดคล้องกันถูกตั้งค่าไว้ด้านบน

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

ลองตั้งชื่อมันว่า "บิตอาเรย์ที่มีขนาดพอเหมาะ" จากนั้น เส้นตรงในความยาวบิตเทียบเท่ากับ log-n คุณจริงจังกับการได้รับประสิทธิภาพการทำงานของ log-n โดยไม่มีข้อ จำกัด หรือเงื่อนไขเบื้องต้นในข้อมูลอินพุต
Thorbjørn Ravn Andersen

2
@ ThorbjørnRavnAndersenพื้นที่ว่างเป็นเลขชี้กำลังในความยาวบิต (คุณต้องแมปจากค่าที่เป็นไปได้ทั้งหมด) และเวลาเป็นเส้นตรงในขนาดรายการทั้งหมด (คุณต้องดูค่าทั้งหมดในรายการทั้งสอง) ไม่มีสิ่งใดเป็นเส้นตรงในความยาวบิต
wchargin

0

เนื่องจากคุณกำลังบอกว่าทั้งสองรายการมีจำนวนเต็มฉันเดาว่าเราสามารถเรียกใช้การเรียงเรดิกในทั้งสองรายการจากนั้นทำการค้นหาเชิงเส้นเปรียบเทียบทั้งสองรายการสำหรับรายการที่เทียบเท่า


4
วิธีนี้ใช้งานได้หากมีการ จำกัด ขนาดของตัวเลขเท่านั้น
Luke Mathieson

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

เกิดอะไรขึ้นถ้าหนึ่งในตัวเลขคือ 2 ^ (2 ^ 128)
miniBill

@anirudh แต่แล้วคุณมีอัลกอริทึมที่แตกต่างกันสำหรับขนาดอินพุตที่แตกต่างกัน - คุณต้องการตัวอักษรที่ใหญ่กว่าในแต่ละครั้งที่คุณเพิ่ม radix คุณแค่ส่งออกความซับซ้อนของการเพิ่มขนาดเพื่อเพิ่มขนาดตัวอักษร แน่นอนว่าสิ่งนี้เป็นไปได้ในทางทฤษฎีเช่นกันฉันไม่คิดว่าฮาร์ดแวร์จำนวนมากจะอนุญาตให้คุณเปลี่ยนฐานที่มันแทนตัวเลขใน (เราสามารถทำท่าที่อินพุตและเอาต์พุตสิ้นสุด แต่มันเดือดลงไปเป็นไบนารี (ส่วนใหญ่) )
Luke Mathieson

0

ทำไมไม่ใส่จำนวนเต็มของแต่ละรายการลงในค่าบิตทริกแบบง่าย? นี่จะไม่เหมาะสมในแง่ที่ว่าโดยที่คือขนาดบิตเฉลี่ยของจำนวนเต็ม; โดยเฉพาะฉันไม่เห็นวิธีที่คุณสามารถทำได้ดีกว่าเพราะเพียงแค่อ่าน *ทั้งสองรายการจะใช้เวลานี้O(nm¯)m¯


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

@DW ในรูปแบบ RAM มีขนาดคำซึ่งเป็นค่าคงที่และมันขอบเขตและทำให้ซึ่งส่งผลให้เกิดรันไทม์ของหรือ am ฉันเข้าใจผิด wmm¯O(n)
Realz Slaw

อืมอาจจะพิจารณาคงเป็นความผิดพลาด w
Realz Slaw

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

-1

มันคล้ายกับปัญหา Elemet Uniqueness ซึ่งคุณมีชุดตัวเลข n และคุณต้องการตรวจสอบว่าองค์ประกอบทั้งหมดแตกต่างกันหรือไม่ ปัญหาที่เกิดขึ้นได้ต้นไม้คำนวณพีชคณิตขอบเขตล่างของn)O(nlogn)


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

1
คุณหมายถึง Ω(nlogn)? ถ้าเป็นเช่นนั้นนั่นอาจชี้ให้เห็นว่าปัญหาในคำถามนั้นไม่สามารถแก้ไขได้ในเวลาเชิงเส้น แต่เพียงแค่บอกว่าปัญหาที่เกี่ยวข้องสามารถแก้ไขได้ในเวลาล็อกเชิงเส้นไม่ตอบคำถามจริงๆ (cc @EvilJS)
David Richerby

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

สามารถทำได้ค่ะ O(nloglogn) เวลาที่ดีกว่าที่กำหนด O(nlogn)ดังนั้นฉันแน่ใจว่านี่ไม่ใช่ Ω(nlogn)แต่นี่ไม่ได้แก้คำถาม DW ดังนั้นเพียงแค่แสดงความคิดเห็นที่นี่
Evil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.