รายการข้ามทำงานอย่างไร


14

สำหรับการบ้านฉันต้องเข้าใจว่าการข้ามรายการทำงานอย่างไร

ฉันได้เขียนโปรแกรมมานานกว่า 2 ปีแล้ว (ฉันรู้ว่ามันไม่ได้อยู่ในความเป็นจริงมานานแล้ว) และฉันไม่เคยได้ยินชื่อข้ามเลย

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

รายการข้ามทำงานอย่างไร จำเป็นต้องมีความรู้เกี่ยวกับรายการข้ามหรือไม่ที่จะเข้าใจโครงสร้างข้อมูลขั้นสูงหรือไม่



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

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

1
@Carcigenicate อธิบายว่าพวกเขาทำงานจริงในหัวข้อมากกว่าถามว่าคุณจะเห็นพวกเขาในโลกแห่งความเป็นจริง เราสามารถเดาได้ว่าสิ่งที่คุณกำลังทำและอาณาจักรต่างๆ การถามว่าเราเห็นพวกเขาในโลกแห่งความเป็นจริงกำลังทำการสำรวจเราว่า "ใช่ฉันเห็นพวกเขาและใช้พวกเขา" หรือ "ไม่ไม่เคยได้ยิน" - ซึ่งไม่ได้ทำเพื่อประโยชน์หรือคำตอบที่ดีสำหรับคนอื่น ๆ

คำตอบ:


29

ในวันเก่าในชั้นโครงสร้างข้อมูลเราเรียนรู้ว่าต้นไม้ AVL ทำงานอย่างไร ฉันจะได้มันมาในชั้นเรียนหนึ่งของฉัน แต่ผู้สอนบอกว่า "คุณจะไม่ใช้สิ่งนี้จริง ๆ " และให้เราเรียนรู้ต้นไม้ 2-3 ต้นและต้นไม้ b * แทน วันเหล่านั้นเป็นช่วงเวลาที่ความจำแน่นและกระบวนการต่างๆ คุณไม่ได้ใช้ deque เมื่อรายการที่เชื่อมโยงโดยลำพังจะใช้งานได้เช่นกัน

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

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

คุณไม่จำเป็นต้องเขียนตั้งแต่ต้น (เว้นแต่คุณจะได้รับมันเป็นคำถามสัมภาษณ์ - แต่คุณก็มีแนวโน้มที่จะนำต้นไม้ AVL ไปใช้)

คุณกำลังจะต้องเข้าใจว่าทำไมคุณต้องการที่จะเลือกConcurrentSkipListMapในชวามากกว่าHashMapหรือTreeMapหรือใด ๆ ของการใช้งานแผนที่อื่น ๆ


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

ให้บอกว่าเรามีต้นไม้นี้:

ต้นไม้ไบนารี

และเราใส่ '8' ลงไป ตอนนี้เรามี:

ต้นไม้ไบนารีที่ไม่สมดุล

และนั่นไม่สมดุล ดังนั้นเราจะไปและทำให้ความมหัศจรรย์ของการสร้างความสมดุลผ่านการใช้งานบางอย่าง ...

ต้นไม้ที่สมดุล

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

ให้ใช้รายการข้าม

รายการข้ามที่เหมาะ

อันนี้เป็นอันที่เงียบสงบ มีเพียงไม่กี่แห่งเท่านั้น แต่มันแสดงให้เห็นถึงลักษณะของต้นไม้ไบนารีแบบสมดุลที่นัก skiplist อุดมคติ

ตอนนี้เราต้องการแทรก 6 ลงไปที่นั่น นี่เป็นการแทรกเหมือนรายการที่ลิงก์ อย่างไรก็ตามเราเริ่มที่ด้านบนและลงไป คะแนนสูงสุดถึง 5 คือ 6> 5 หรือไม่ ใช่. ตกลงจุดสูงสุดออกไปจนจบตอนนี้เราเลยลงไปกอง (เราอยู่บน 5) ถัดไปคือ 7 คือ 6> 7 หรือไม่ Nope ดังนั้นเราลงไปสู่ระดับหนึ่งและเราอยู่ที่ระดับฐานดังนั้นเราจึงใส่ 6 ไปทางขวาของ 5

เราพลิกเหรียญ - หัวที่เราสร้าง, หางที่เราอยู่ เสื้อหางยาว ไม่ต้องทำอะไรอีก

ข้ามรายการหลังจากการแทรก

ให้ใส่ที่ 8 ตอนนี้ 8> 5? อ๋อ 8> 7? อ๋อ และตอนนี้เราอยู่ที่ระดับล่างสุดอีกครั้งหลังจากติดตามลูกศรและสแต็ครอบ ๆ แล้วเราทดสอบ 8> 11 หรือไม่ Nope ดังนั้นเราจึงใส่ 8 ทางด้านขวาของ 7

เราพลิกเหรียญ - หัวที่เราสร้าง, หางที่เราอยู่ เสื้อหางยาว ไม่ต้องทำอะไรอีก

ข้ามรายการหลังจากแทรกอีกครั้ง

ในต้นไม้ที่สมดุลเราจะทำให้ทุกอย่างเรียบร้อยขึ้นเกี่ยวกับต้นไม้ที่ไม่สมดุลกันในตอนนี้ แต่นี่ไม่ใช่ต้นไม้ - เป็นรายการข้าม เราประมาณต้นไม้ที่สมดุล

ตอนนี้ให้แทรก 10 ฉันจะหลีกเลี่ยงการเปรียบเทียบทั้งหมด

เราพลิกเหรียญ - หัวที่เราสร้าง, หางที่เราอยู่ หัว! และพลิกอีกครั้งหัวอีกครั้ง! พลิกอีกครั้งตกลงมีหาง สองระดับเหนือรายการเชื่อมโยงฐาน

ข้ามรายการหลังจากใส่อีกรายการหนึ่ง

ข้อได้เปรียบตรงนี้คือตอนนี้ถ้าเราจะใส่ 12 เราสามารถข้ามจาก 5 ไป 10 โดยไม่ทำการเปรียบเทียบอื่น ๆ ทั้งหมด เราสามารถข้ามรายการเหล่านั้นด้วยรายการข้าม และเราไม่ต้องกังวลกับต้นไม้ที่สมดุล - ธรรมชาติความน่าจะเป็นของการซ้อนจะเป็นเช่นนั้นสำหรับเรา

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

คุณจะพบหรือไม่ คุณอาจเห็นมันใช้งานในสถานที่ แล้วคุณจะรู้ว่าทำไมผู้เขียนเลือกใช้งานนั้นมากกว่าTreeMapหรือHashMapสำหรับโครงสร้าง

สิ่งเหล่านี้ส่วนใหญ่ได้รับการยืมมาจากโพสต์บล็อกของฉัน: รายการข้าม


ขอขอบคุณ. ไม่ใช่แม้แต่การใช้งานทั่วไปที่ฉันไม่เข้าใจ ฉันได้รับความคล้ายคลึงกับ BST ของพวกเขา ฉันพยายามคิดว่าฉันจะนำไปใช้อย่างไรและความคิดในการจัดการตัวชี้ / การอ้างอิงทั้งหมดทำให้ฉันสับสนตลอดเวลา บางทีฉันปล่อยให้ตัวเองผิดหวังมากเกินไป ขอบคุณ ฉันจะลองเก็บมันในวันพรุ่งนี้โดยใช้คำตอบของคุณเป็นจุดเริ่มต้น
Carcigenicate

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

2
รายการที่เชื่อมโยงคือ " ต้นไม้ที่ไม่สมดุลอย่างมาก " รายการข้ามเป็นชนิดของการเพิ่มกลับบางส่วนของโครงสร้างต้นไม้ที่ด้านบนของรายการ โดยส่วนตัวแล้วฉันเป็นแฟนตัวยงของโครงสร้างข้อมูลแบบถาวรและต้นไม้ดูเหมือนจะง่ายกว่าที่จะให้เหตุผลในบริบทนั้น ฉันไม่คิดว่ามันเป็นเรื่องบังเอิญที่ Clojure, Scala, et al ดูเหมือนว่าจะมีการรวมกันในลักษณะแฮชแบบแบกเวลบางประเภทเป็นโครงสร้างข้อมูลพื้นฐาน (Phil Bagwell มีส่วนร่วมในการออกแบบกรอบการรวบรวมของ Scala สำหรับ Scala 2.8) รายการข้ามก็ยังดีอยู่ดี
Jörg W Mittag

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