หากคุณมีรอบน้อยมากนี่คืออัลกอริทึมที่จะใช้พื้นที่น้อยลง แต่ใช้เวลานานกว่าในการยกเลิก
[แก้ไข.]การวิเคราะห์รันไทม์ก่อนหน้าของฉันพลาดค่าใช้จ่ายที่สำคัญในการพิจารณาว่าโหนดที่เราเข้าชมนั้นอยู่ในกลุ่มตัวอย่างก่อนหน้านี้หรือไม่ คำตอบนี้ได้รับการแก้ไขบ้างเพื่อแก้ไข
เราวนซ้ำองค์ประกอบทั้งหมดของเอสอีกครั้ง ขณะที่เราสำรวจวงโคจรขององค์ประกอบs ∈ Sเราจะสุ่มตัวอย่างจากโหนดที่เราเคยเยี่ยมชมเพื่อให้สามารถตรวจสอบได้ว่าเราเจอพวกมันอีกครั้งหรือไม่ นอกจากนี้เรายังเก็บรายการตัวอย่างจาก 'ส่วนประกอบ' - สหภาพของวงโคจรที่สิ้นสุดในวงจรทั่วไป (ซึ่งมีจำนวนเท่ากับรอบ) - ที่เคยมีการเยี่ยมชมมาก่อน
เริ่มต้นรายการส่วนประกอบที่ว่างเปล่า, complist
. แต่ละองค์ประกอบจะถูกแทนด้วยชุดของตัวอย่างจากองค์ประกอบนั้น เรายังคงโครงสร้างการค้นหาsamples
ที่จัดเก็บองค์ประกอบทั้งหมดที่ได้รับเลือกเป็นตัวอย่างสำหรับส่วนประกอบบางส่วนหรืออื่น ๆ ให้Gเป็นลำดับของจำนวนเต็มสูงสุดถึงnซึ่งสมาชิกสามารถกำหนดได้อย่างมีประสิทธิภาพโดยการคำนวณคำสั่งบูลีน ตัวอย่างเช่นอำนาจของ 2 หรือที่สมบูรณ์แบบP THอำนาจสำหรับบางจำนวนเต็มพี สำหรับแต่ละs ∈ Sทำต่อไปนี้:
- ถ้าsอยู่ใน
samples
ให้ข้ามไปที่ขั้นตอนที่ 5
- เริ่มต้นรายการที่ว่างเปล่า
cursample
ตัววนซ้ำj ← f ( s ) และตัวนับt ← 1
- ในขณะที่เจไม่ได้อยู่ใน
samples
:
- หากเสื้อ ∈ Gแทรกญทั้งในและcursample
- เพิ่มเสื้อและชุดเจ ← f (ญ)samples
- ตรวจสอบว่าjอยู่
cursample
หรือไม่ หากไม่มีเราพบองค์ประกอบที่สำรวจมาก่อนหน้านี้: เราตรวจสอบว่าองค์ประกอบjเป็นของอะไรและแทรกองค์ประกอบทั้งหมดของcursample
เข้าไปในองค์ประกอบที่เหมาะสมของcomplist
เพื่อเพิ่มองค์ประกอบนั้น มิฉะนั้นเราได้อีกครั้งพบองค์ประกอบจากวงโคจรในปัจจุบันหมายความว่าเราได้สำรวจรอบอย่างน้อยหนึ่งครั้งโดยไม่ต้องเผชิญหน้าตัวแทนของรอบก่อนหน้านี้การค้นพบใด ๆ เราแทรกเป็นคอลเลกชันของกลุ่มตัวอย่างจากส่วนที่ค้นพบใหม่ลงไปcursample
complist
- ดำเนินการต่อไปองค์ประกอบถัดไปs ∈ S
สำหรับn = | S |, ให้X (n)เป็นฟังก์ชันเพิ่มเสียงเดียวที่อธิบายถึงจำนวนรอบที่คาดหวัง ( เช่น X (n) = n 1/3 ), และให้Y (n) = y (n) บันทึก ( n ) ∈Ω ( X (n) log ( n )) เป็นฟังก์ชั่นเพิ่มเสียงโมโนโทนกำหนดเป้าหมายสำหรับการใช้หน่วยความจำ ( เช่น y (n) = n 1/2 ) เราต้องการy (n) ∈Ω ( X (n) ) เพราะมันจะใช้พื้นที่อย่างน้อยX (n) log ( n ) เพื่อเก็บตัวอย่างหนึ่งตัวอย่างจากแต่ละองค์ประกอบ
ยิ่งมีวงโคจรที่เราสุ่มตัวอย่างมากเท่าไหร่ก็ยิ่งมีโอกาสมากขึ้นที่เราจะเลือกตัวอย่างในวงรอบปลายวงโคจรเร็วขึ้น จากจุด asymptotics ในมุมมองของมันก็ทำให้ความรู้สึกที่จะได้รับเป็นตัวอย่างมากที่สุดเท่าที่ขอบเขตหน่วยความจำของเราอนุญาต: เราอาจตามที่กำหนดไว้อย่างดีจีที่จะมีการคาดว่าปี (n)องค์ประกอบที่มีน้อยกว่าn
- หากความยาวสูงสุดของวงโคจรในSคาดว่าจะเป็นLเราอาจปล่อยให้Gเป็นหลายจำนวนเต็มของL / Y (n)
- หากไม่มีความยาวที่คาดไว้เราอาจสุ่มตัวอย่างหนึ่งครั้งทุก ๆn / y (n)องค์ประกอบ; นี่คือกรณีใด ๆ ขอบเขตบนบนช่วงเวลาระหว่างกลุ่มตัวอย่าง
หากในการค้นหาองค์ประกอบใหม่เราเริ่มสำรวจองค์ประกอบของSที่เราเคยเข้าชมก่อนหน้านี้ (ไม่ว่าจะเป็นองค์ประกอบใหม่ที่ถูกค้นพบหรือองค์ประกอบเก่าที่มีการค้นพบวงจรเทอร์มินัล) มันจะใช้เวลาn / yมากที่สุดn)การวนซ้ำเพื่อหาองค์ประกอบตัวอย่างก่อนหน้านี้ นี่เป็นขอบเขตบนของจำนวนครั้งสำหรับความพยายามในการค้นหาส่วนประกอบใหม่แต่ละครั้งเราสำรวจโหนดซ้ำซ้อน เพราะเราทำให้nความพยายามดังกล่าวเราจะเกินความจำเป็นแล้วแวะไปที่องค์ประกอบของSที่มากที่สุดn 2 / Y (n)ครั้งรวม
งานที่ต้องใช้ในการทดสอบการเป็นสมาชิกในsamples
คือ O ( y (n) log y (n) ) ซึ่งเราทำซ้ำในทุกครั้งที่เข้าชม: ค่าใช้จ่ายสะสมของการตรวจสอบนี้คือ O ( n 2 log y (n) ) นอกจากนี้ยังมีค่าใช้จ่ายในการเพิ่มตัวอย่างไปยังคอลเลกชันที่เกี่ยวข้องซึ่งรวมกันเป็น O ( y (n) log y (n) ) ในที่สุดทุกครั้งที่เราพบส่วนประกอบที่ค้นพบก่อนหน้านี้อีกครั้งเราจะต้องใช้เวลามากถึงX (n) บันทึก * y (n)เวลาเพื่อกำหนดองค์ประกอบที่เราค้นพบอีกครั้ง เช่นนี้อาจเกิดขึ้นได้ถึงnครั้งการทำงานที่เกี่ยวข้องกับการสะสมเป็นที่สิ้นสุดโดยn X (n) เข้าสู่ระบบ Y (n)
ดังนั้นงานสะสมที่ดำเนินการในการตรวจสอบว่าโหนดที่เราเข้าชมนั้นอยู่ในกลุ่มตัวอย่างหรือไม่นั้นควบคุมเวลาทำงาน: ค่าใช้จ่าย O ( n 2 log y (n) ) จากนั้นเราควรทำให้y (n) มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ซึ่งก็คือ O ( X (n) )
ดังนั้นหนึ่งอาจระบุจำนวนรอบ (ซึ่งเป็นเช่นเดียวกับจำนวนขององค์ประกอบที่สิ้นสุดในรอบเหล่านั้น) ในพื้นที่ O ( X (n) บันทึก ( n )) การใช้ O ( n 2 log X (n) ) เวลาที่จะทำเช่นนั้นโดยที่X (n)คือจำนวนรอบที่คาดไว้