ในวันเก่าในชั้นโครงสร้างข้อมูลเราเรียนรู้ว่าต้นไม้ 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
สำหรับโครงสร้าง
สิ่งเหล่านี้ส่วนใหญ่ได้รับการยืมมาจากโพสต์บล็อกของฉัน: รายการข้าม