กำลังมองหาชุดการใช้งานที่มีหน่วยความจำขนาดเล็ก


9

ฉันกำลังมองหาการนำไปใช้ของชนิดข้อมูลชุด นั่นคือเราต้อง

  • รักษาเซตย่อยแบบไดนามิก S (ขนาด n) จากเอกภพของขนาดด้วยยู={0,1,2,3,...,ยู-1}ยู
  • การดำเนินงานinsert(x)(เพิ่มองค์ประกอบxในS ) และfind(x)(ตรวจสอบว่าองค์ประกอบxเป็นสมาชิกของS )

ฉันไม่สนใจเกี่ยวกับการดำเนินงานอื่น ๆ สำหรับการวางแนวในการใช้งานฉันกำลังทำงานกับเรามียู1010{10}

ฉันรู้ของการใช้งานที่ให้การดำเนินงานทั้งสองในเวลาO(1)ดังนั้นฉันกังวลส่วนใหญ่เกี่ยวกับขนาดของโครงสร้างข้อมูล ฉันคาดว่าหลายพันล้านรายการรายการ แต่ต้องการหลีกเลี่ยงการแลกเปลี่ยนให้มากที่สุด

ฉันยินดีเสียสละเวลาทำงานหากจำเป็น ค่าตัดจำหน่ายรันไทม์ของO(เข้าสู่ระบบn)คือสิ่งที่ฉันยอมรับได้; Runtimes ที่คาดหวังหรือ Runtimes ในω(เข้าสู่ระบบn)ไม่สามารถยอมรับได้

หนึ่งความคิดที่ฉันมีคือถ้าหากSสามารถแสดงเป็นสหภาพของช่วง[xmin, xmax]แล้วเราจะสามารถประหยัดขนาดการจัดเก็บด้วยราคาของประสิทธิภาพลดลง นอกจากนี้บางรูปแบบข้อมูลอื่น ๆ [0, 2, 4, 6]ที่เป็นไปได้เช่น

คุณช่วยชี้ฉันไปที่โครงสร้างข้อมูลที่สามารถทำสิ่งนั้นได้ไหม



องค์ประกอบจำนวนองค์ประกอบเข้าสู่รูปภาพได้อย่างไร คือเกิดอะไรขึ้นถ้าองค์ประกอบถูกแทรกและมีอยู่แล้ว? nn
vonbrand

@ vonbrand - nขนาดของชุด S สามารถเพิ่มได้ทุกตัวinsertหรือจะยังคงเหมือนเดิมหากองค์ประกอบxอยู่ในชุดแล้ว
HEKTO

3
คุณสามารถยอมรับความน่าจะเป็นที่เป็นผลบวกเล็กน้อยได้หรือไม่? ถ้าเป็นเช่นนั้นตัวกรองการเบ่งบานอาจเหมาะ: en.wikipedia.org/wiki/Bloom_filter
Joe

1
@AlekseyYakovlev อัตราการปลอมบวกของตัวกรองการบานไม่มีอะไรเกี่ยวข้องกับขนาดของจักรวาล (เฉพาะจำนวนฟังก์ชันแฮชเท่านั้น kขนาดของโครงสร้างข้อมูล mและจำนวนรายการ n), แต่ถ้า n อยู่ใกล้กับ u (พูด u=nc สำหรับค่าคงที่ขนาดเล็ก c) คุณจะกดยากที่จะทำดีกว่าเวกเตอร์บิตง่ายฉันคิดว่ามีเพียง cnบิตทั้งหมดของพื้นที่
Joe

คำตอบ:


8

คำตอบของโจนั้นดีมากและให้คำสำคัญทั้งหมดแก่คุณ

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

ถ้าคอลเลกชันกึ่งคงที่ (นั่นคือส่วนแทรกหายากหรืออย่างน้อยปริมาณต่ำ) ก็แน่นอนว่าคุ้มค่าที่จะพิจารณาโครงสร้างข้อมูลคงที่ง่ายต่อการใช้งาน (sdarray Sadakane เป็นตัวเลือกที่ดี) ร่วมกับการปรับปรุง ขุมทรัพย์ โดยทั่วไปคุณบันทึกการปรับปรุงในโครงสร้างข้อมูลแบบดั้งเดิม (เช่น B-tree, trie, ตารางแฮช) และอัปเดตโครงสร้างข้อมูล "หลัก" เป็นระยะ ๆ นี่เป็นเทคนิคที่ได้รับความนิยมอย่างมากในการดึงข้อมูลเนื่องจากดัชนีแบบกลับด้านมีข้อได้เปรียบมากมายสำหรับการค้นหา แต่ยากที่จะอัปเดตในสถานที่ หากเป็นกรณีนี้โปรดแจ้งให้เราทราบในความคิดเห็นและฉันจะแก้ไขคำตอบนี้เพื่อให้คำแนะนำแก่คุณ

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

ข้อมูลพื้นฐานทางทฤษฎีผลก็คือถ้าคุณเก็บ n องค์ประกอบจากจักรวาลของ ยู รายการและไม่มีข้อมูลอื่น ๆ (เช่นไม่มีความสัมพันธ์ระหว่างองค์ประกอบ) จากนั้นคุณต้องการ เข้าสู่ระบบ(ยูn)+O(1)บิตในการจัดเก็บ (ลอการิทึมทั้งหมดเป็นฐาน -2 เว้นแต่จะระบุไว้เป็นอย่างอื่น) คุณต้องการบิตจำนวนมาก ไม่มีทางรอบมัน

ตอนนี้บางคำศัพท์:

  • หากคุณมีโครงสร้างข้อมูลที่สามารถจัดเก็บข้อมูลและสนับสนุนการทำงานของคุณได้ เข้าสู่ระบบ(ยูn)+O(1)บิตของพื้นที่เราเรียกสิ่งนี้ว่าโครงสร้างข้อมูลโดยนัย
  • หากคุณมีโครงสร้างข้อมูลที่สามารถจัดเก็บข้อมูลและสนับสนุนการทำงานของคุณได้ เข้าสู่ระบบ(ยูn)+O(เข้าสู่ระบบ(ยูn))=(1+O(1))เข้าสู่ระบบ(ยูn)บิตของพื้นที่เราเรียกสิ่งนี้ว่าโครงสร้างข้อมูลที่กะทัดรัด โปรดทราบว่าในทางปฏิบัติสิ่งนี้หมายความว่าค่าใช้จ่ายสัมพัทธ์ (สัมพันธ์กับค่าต่ำสุดทางทฤษฎี) อยู่ภายในค่าคงที่ มันอาจเป็น 5% ค่าใช้จ่ายหรือ 10% ค่าใช้จ่ายหรือ 10 เท่าของค่าใช้จ่าย
  • หากคุณมีโครงสร้างข้อมูลที่สามารถจัดเก็บข้อมูลและสนับสนุนการทำงานของคุณได้ เข้าสู่ระบบ(ยูn)+โอ(เข้าสู่ระบบ(ยูn))=(1+โอ(1))เข้าสู่ระบบ(ยูn)บิตของพื้นที่เราเรียกสิ่งนี้ว่าโครงสร้างข้อมูลที่รวบรัด

ความแตกต่างระหว่างรวบรัดและกะทัดรัดคือความแตกต่างระหว่างโอ๋น้อยและใหญ่โอ๋ ไม่สนใจสิ่งที่มีคุณค่าแน่นอนอยู่ครู่หนึ่ง ...

  • ก.(n)=O((n)) หมายความว่ามีค่าคงที่ และตัวเลข n0 เช่นนั้นสำหรับทุกคน n>n0, ก.(n)<(n).
  • ก.(n)=โอ((n)) หมายความว่าสำหรับค่าคงที่ทั้งหมด มีตัวเลขอยู่ n0 เช่นนั้นสำหรับทุกคน n>n0, ก.(n)<(n).

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

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

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

การดำเนินการค้นหาจะแฮช nคีย์บิตปิดบัง ม.บิตเพื่อค้นหาสล็อตแฮชจากนั้นตรวจสอบเพื่อดูว่าค่าในตารางตรงกับคีย์หรือไม่ จนถึงตอนนี้ดีมาก

ตารางแฮชนั้นใช้ n2ม.เกร็ด เราทำได้ดีกว่านี้ไหม

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

ถ้า 2ม. มีขนาดเล็กเมื่อเทียบกับ 2nการประมาณของสเตอร์ลิงและเลขคณิตเล็กน้อย (การพิสูจน์เป็นการออกกำลังกาย!) เผยให้เห็นว่า:

(n-ม.)2ม.=เข้าสู่ระบบ(2n2ม.)+โอ(เข้าสู่ระบบ(2n2ม.))

ดังนั้นโครงสร้างข้อมูลนี้สั้นกระชับ

อย่างไรก็ตามมีสองการจับ

การจับครั้งแรกคือการสร้างฟังก์ชั่นแฮช "ดี" กลับด้าน โชคดีที่มันง่ายกว่าที่คิด cryptographers ทำให้ฟังก์ชั่นกลับด้านได้ตลอดเวลามี แต่พวกมันเท่านั้นที่เรียกว่า "cyphers" ตัวอย่างเช่นคุณสามารถใช้ฟังก์ชันแฮชบนเครือข่าย Feistel ซึ่งเป็นวิธีที่ตรงไปตรงมาในการสร้างฟังก์ชั่นแฮชที่กลับด้านได้จากฟังก์ชั่นแฮชที่ไม่สามารถย้อนกลับได้

จับที่สองคือตารางแฮชจริงไม่เหมาะขอบคุณวันเกิดความขัดแย้ง ดังนั้นคุณจึงต้องการใช้ตารางแฮชที่มีความซับซ้อนมากขึ้นซึ่งจะทำให้คุณเข้าใกล้การเข้าพักเต็มโดยไม่มีการรั่วไหล Cuckoo hashing นั้นสมบูรณ์แบบสำหรับสิ่งนี้เพราะมันจะช่วยให้คุณเข้าใกล้ในอุดมคติในทางทฤษฎีและฝึกฝนอย่างใกล้ชิด

การแฮชของ Cuckoo นั้นต้องการฟังก์ชั่นแฮชที่หลากหลายและต้องการให้มีการติดแท็กค่าในช่องแฮชที่ใช้ฟังก์ชันแฮช ตัวอย่างเช่นถ้าคุณใช้ฟังก์ชันแฮชสี่ฟังก์ชันคุณต้องเก็บสองบิตเพิ่มเติมในแต่ละช่องแฮช นี้ยังคงรวบรัดเป็นม. เติบโตขึ้นดังนั้นจึงไม่เป็นปัญหาในทางปฏิบัติและยังคงเก็บคีย์ทั้งหมดไว้

โอ้คุณอาจต้องการดูต้นแวนเอมเดอโบสด้วย

ความคิดเพิ่มเติม

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

ถ้า n อยู่ใกล้กับ ยูวรรณคดีโครงสร้างข้อมูลที่กระชับทั้งหมดแนะนำให้คุณย้อนกลับไปใช้ความรู้สึกของพจนานุกรม เก็บค่าที่ไม่เกิดขึ้นในชุด อย่างไรก็ตามตอนนี้คุณต้องสนับสนุนการลบอย่างมีประสิทธิภาพและเพื่อรักษาพฤติกรรมที่กระชับคุณยังต้องสามารถลดขนาดโครงสร้างข้อมูลเมื่อองค์ประกอบเพิ่มเติมได้รับ "เพิ่ม" การขยายตารางแฮชเป็นการดำเนินการที่เข้าใจกันดี แต่การทำสัญญาไม่ใช่


สวัสดีสำหรับย่อหน้าที่สองของคำตอบของคุณ - ฉันคาดหวังว่าการโทรทุกครั้งinsertจะมาพร้อมกับการโทรfindด้วยอาร์กิวเมนต์เดียวกัน ดังนั้นถ้าfindผลตอบแทนแล้วเราเพียงแค่ข้ามtrue insertดังนั้นความถี่ของการfindโทรนั้นมากขึ้นกว่าความถี่ของการinsertโทรและเมื่อnใกล้จะถึงuแล้วการinsertโทรก็จะหายากมาก
HEKTO

แต่คุณคาดหวัง ยู เพื่อเข้าใกล้ nในที่สุด?
นามแฝง

ในโลกแห่งความเป็นจริงมีการเติบโตจนกระทั่งมาถึงคุณอย่างไรก็ตามเราไม่สามารถคาดการณ์ได้ว่ามันจะเกิดขึ้นหรือไม่ โครงสร้างข้อมูลควรใช้งานได้ดีสำหรับทุกคนn <= u
HEKTO

ขวา. ถ้าอย่างนั้นมันก็ยุติธรรมที่จะบอกว่าเราไม่รู้โครงสร้างข้อมูลเดียวที่รวบรัด (ในแง่ที่ดีกว่า) และสิ่งนี้บรรลุผลในทุกช่วงของnu. ฉันคิดว่าคุณจะต้องการโครงสร้างข้อมูลที่กระจัดกระจายเมื่อn<uจากนั้นเปลี่ยนเป็นแบบหนาแน่น (เช่นบิตเวกเตอร์) เมื่อ n รอบ ๆ u2จากนั้นโครงสร้างข้อมูลแบบเบาบางด้วยความรู้สึกแบบกลับด้านเมื่อ n อยู่ใกล้กับ u.
นามแฝง

5

ดูเหมือนคุณต้องการรวบรัดโครงสร้างข้อมูลสำหรับปัญหาการเป็นสมาชิกแบบไดนามิก

จำได้ว่าโครงสร้างข้อมูลรวบรัดเป็นหนึ่งที่ต้องการพื้นที่คือ "ใกล้" เพื่อข้อมูลตามทฤษฎีขอบเขตล่าง แต่ไม่เหมือนโครงสร้างข้อมูลบีบอัดยังช่วยให้สำหรับการค้นหาที่มีประสิทธิภาพ

ปัญหาสมาชิกเป็นสิ่งที่คุณอธิบายในคำถามของคุณ:

รักษาเซตย่อย S (ขนาด n) จากจักรวาล ยู={0,1,2,3,...,ยู-1} ขนาด ยู ด้วยการดำเนินงาน:

  • find(x)(ตรวจสอบว่าองค์ประกอบxเป็นสมาชิกหรือไม่S)
  • insert(x)(เพิ่มองค์ประกอบxลงในS)
  • delete(x)ลบองค์ประกอบxออกจากS)

หากสนับสนุนเฉพาะการfindดำเนินการนี่เป็นปัญหาสมาชิกภาพคงที่ หากสนับสนุนอย่างใดอย่างหนึ่งinsertหรือdeleteไม่ แต่ไม่ใช่ทั้งสองอย่างมันจะถูกเรียกว่าsemi-dynamicและหากรองรับทั้งสามการดำเนินการจะเรียกว่าปัญหาสมาชิกภาพแบบไดนามิก

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

ในทฤษฎีบท 5.1 ของบทความสมาชิกในเวลาคงที่และพื้นที่เกือบขั้นต่ำ Brodnik และมันโรให้ผลดังต่อไปนี้:

มีโครงสร้างข้อมูลที่ต้องการ O(B) บิตซึ่งสนับสนุนการค้นหาในเวลาอย่างต่อเนื่องและการแทรกและลบในอย่างต่อเนื่องคาดว่าเวลาตัดจำหน่าย

ที่ไหน B=เข้าสู่ระบบ(ยูn) เป็นจำนวนข้อมูลขั้นต่ำทางทฤษฎีของบิตที่จำเป็น

แนวคิดพื้นฐานคือพวกเขาแบ่งจักรวาลซ้ำ ๆ เป็นช่วงขนาดที่เลือกอย่างระมัดระวังดังนั้นแม้ฟังดูเหมือนว่าเทคนิคอาจอยู่ในแนวที่คุณคิด

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


1
นามธรรมของกระดาษ Brodnik & Munro ไม่ได้พูดอะไรเกี่ยวกับส่วนแทรก แต่ผลลัพธ์ของพวกเขาคือสิ่งที่เราคาดหวังใช่มั้ย ถ้าหากn = u/2พื้นที่ที่ต้องการนั้นสูงสุด
HEKTO

@AlekseyYakovlev พวกเขาไม่ได้พูดถึงกรณีแบบไดนามิกในนามธรรม แต่ทฤษฎีบทที่เกี่ยวข้องกับกรณีแบบไดนามิกจะถูกยกมาในคำตอบของฉัน (จากมาตรา 5)
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.