คำถามติดแท็ก data-structures

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

5
ข้อมูลประเภทใดที่มีการดำเนินการตารางแฮช O (1)
จากคำตอบถึง(เมื่อ) คือการค้นหาตารางแฮช O (1)? ฉันรวบรวมว่าตารางแฮชมีพฤติกรรมที่เลวร้ายที่สุดกรณีอย่างน้อยตัดจำหน่ายเมื่อข้อมูลเป็นไปตามเงื่อนไขทางสถิติบางอย่างและมีเทคนิคที่จะช่วยทำให้เงื่อนไขเหล่านี้กว้างขึ้นO ( 1 )O(1)O(1) อย่างไรก็ตามจากมุมมองของโปรแกรมเมอร์ฉันไม่ทราบล่วงหน้าว่าข้อมูลของฉันจะเป็นอะไร: มักจะมาจากแหล่งภายนอก และฉันไม่ค่อยมีข้อมูลทั้งหมดในครั้งเดียว: บ่อยครั้งที่การแทรกและการลบเกิดขึ้นในอัตราที่ไม่ต่ำกว่าอัตราการค้นหาดังนั้นการประมวลผลข้อมูลล่วงหน้าเพื่อปรับฟังก์ชั่นแฮชหายไป ดังนั้นการก้าวออกจาก: ให้ความรู้เกี่ยวกับแหล่งข้อมูลฉันจะทราบได้อย่างไรว่าตารางแฮชมีโอกาสที่จะมีการดำเนินงานและอาจใช้เทคนิคใดในการใช้ฟังก์ชันแฮชของฉันO ( 1 )O(1)O(1)

3
จุดประสงค์ของการใช้ NIL คืออะไรเพื่อแสดงโหนดว่าง
ในหลักสูตรอัลกอริทึมและโครงสร้างข้อมูลของฉันอาจารย์สไลเดอร์และหนังสือ ( Introduction to Algorithms รุ่นที่ 3 ) ใช้คำNILที่แสดงถึงตัวอย่างเช่นลูกของโหนด (ในต้นไม้) ที่ไม่มีอยู่ ครั้งหนึ่งระหว่างการบรรยายแทนที่จะพูดNILเพื่อนร่วมชั้นของฉันพูดnullและอาจารย์แก้ไขเขาและฉันก็ไม่เข้าใจว่าทำไมอาจารย์เน้นคำนี้ มีเหตุผลที่คนใช้คำNILแทนnullหรือnoneหรือคำอื่น ๆ ? ไม่NILได้มีความหมายบางอย่างโดยเฉพาะอย่างยิ่งที่คนอื่นไม่ได้? มีเหตุผลทางประวัติศาสตร์บ้างไหม? โปรดทราบว่าฉันได้เห็นบางสถานที่รอบ ๆ เว็บเช่นคำที่nullใช้แทนNILแต่โดยปกติจะใช้คำสุดท้าย

2
โครงสร้างข้อมูลนามธรรมและคอนกรีตแตกต่างกันอย่างไร?
ผมคิดว่าอาเรย์ (แผนที่เช่นหรือพจนานุกรม) และโต๊ะคร่ำเครียดเป็นแนวคิดเดียวกันจนกระทั่งผมเห็นในวิกิพีเดียว่า สำหรับพจนานุกรมที่มีการผูกจำนวนน้อยมากอาจทำให้การใช้พจนานุกรมโดยใช้รายการการเชื่อมโยงเป็นรายการเชื่อมโยงของการเชื่อมโยง ... การใช้งานวัตถุประสงค์ทั่วไปที่ใช้บ่อยที่สุดของอาเรย์แบบเชื่อมโยงคือตารางแฮช: อาเรย์ของการผูกรวมกับฟังก์ชันแฮชที่แมปคีย์ที่เป็นไปได้แต่ละอันในดัชนีอาเรย์ ... พจนานุกรมอาจถูกเก็บไว้ในแผนผังการค้นหาแบบไบนารี่หรือในโครงสร้างข้อมูลที่มีความเฉพาะเจาะจงกับคีย์บางชนิดเช่นต้นเรดิค, ลอง, จูดี้อาเรย์, หรือฟาน Emde Boas ... ดังนั้นฉันคิดว่าปัญหาของฉันอยู่ที่ฉันไม่ทราบว่าอาเรย์เชื่อมโยง (เช่นแผนที่หรือพจนานุกรม) เป็นชนิดข้อมูลนามธรรมและตาราง hashing เป็นโครงสร้างข้อมูลที่เป็นรูปธรรมและโครงสร้างข้อมูลคอนกรีตที่แตกต่างกันสามารถนำไปใช้ ชนิดข้อมูลนามธรรมเดียวกัน คำถามของฉันจะเป็น อะไรคือความแตกต่างและความสัมพันธ์ระหว่างโครงสร้างข้อมูลนามธรรมและโครงสร้างข้อมูลที่เป็นรูปธรรม? มีตัวอย่างอะไรบ้างสำหรับแต่ละคน (โครงสร้างข้อมูลนามธรรมและคอนกรีต) ยิ่งมากยิ่งดี มีรายการโครงสร้างข้อมูลที่เป็นรูปธรรมใดบ้างที่สามารถใช้เพื่อนำไปใช้กับโครงสร้างข้อมูลนามธรรมได้? มันคงจะดีถ้ามีสักอัน

2
มีวิธีแก้ปัญหาที่เร็วกว่าสำหรับปัญหา Great Wall Jam ของ Google Code หรือไม่
ลองพิจารณาคำถามรอบรหัส 1C ของ Google Jamต่อไปนี้: กำแพงเมืองจีนเริ่มออกเป็นสายที่ไม่มีที่สิ้นสุดที่ความสูงในสถานที่ทั้งหมดเป็น0000 ชนเผ่าจำนวนหนึ่ง ,จะโจมตีกำแพงตามพารามิเตอร์ต่อไปนี้ - วันเริ่มต้น, , กำลังเริ่มต้น , พิกัดทิศตะวันตกเริ่มต้น,และพิกัดทิศตะวันออกเริ่มต้น, . นี้การโจมตีครั้งแรกเกิดขึ้นในวันในช่วงที่แข็งแรงSหากมีส่วนใดของกำแพงภายในที่มีส่วนสูงการโจมตีจะสำเร็จและในตอนท้ายของวันกำแพงจะถูกสร้างขึ้นเพื่อให้ส่วนใดส่วนหนึ่งของมันภายในของความสูงนั้นจะอยู่ที่ความสูงยังไม่มีข้อความยังไม่มีข้อความNยังไม่มีข้อความ≤ 1,000ยังไม่มีข้อความ≤1000N \le 1000DDDSSSWWWD [ W , E ] S [ W , E ] &lt; S [ W , E ] &lt; S SEEEDDD[ ว, E][W,E][W,E]SSS[W,E][W,E][W,E]&lt;S&lt;S< S[W,E][W,E][W,E]&lt;S&lt;S< SSSS (หรือมากกว่านั้นหากการโจมตีอื่น ๆ ในวันนั้นโจมตีกลุ่มเดียวกันด้วยความแข็งแกร่ง )S′&gt;SS′&gt;SS' > S …

2
สีต้นไม้ไบนารีให้เป็นต้นไม้สีแดงดำ
คำถามสัมภาษณ์ที่พบบ่อยคือการให้อัลกอริทึมเพื่อตรวจสอบว่าต้นไม้ไบนารีที่กำหนดมีความสูงสมดุล (นิยามของต้นไม้ AVL) ฉันสงสัยว่าถ้าเราสามารถทำอะไรที่คล้ายกับต้นไม้สีแดงดำ ได้รับไบนารีต้นไม้ที่ไม่มีการสุ่มสี (พร้อม NULL nodes) มีอัลกอริทึม "เร็ว" ซึ่งสามารถกำหนดได้ว่าเราสามารถทำสี (และค้นหาการระบายสี) โหนดแดง / ดำเพื่อให้พวกเขาตอบสนองคุณสมบัติทั้งหมดของต้นไม้สีแดง - ดำ (คำจำกัดความในคำถามนี้)? ความคิดเริ่มแรกคือเราสามารถเอาโหนด NULL ออกและลองตรวจสอบซ้ำ ๆ ว่าต้นไม้ที่เกิดขึ้นนั้นสามารถเป็นต้นไม้สีแดงดำได้หรือไม่ แต่ดูเหมือนจะไม่ไปไหนเลย ฉันทำเว็บ (สั้น ๆ ) เพื่อค้นหาเอกสาร แต่ดูเหมือนจะไม่พบสิ่งใดที่ดูเหมือนจะจัดการกับปัญหานี้ เป็นไปได้ว่าฉันขาดอะไรง่ายๆ

3
เพิ่มคีย์และคีย์ลดในไบนารีมินฮีป
ในการสนทนาจำนวนมากของไบนารีฮีปปกติจะมีการแสดงคีย์ลดลงเพียงคีย์ว่าเป็นการดำเนินการที่ได้รับการสนับสนุนสำหรับมินิฮีป ยกตัวอย่างเช่น CLR บทที่ 6.1 และหน้าวิกิพีเดียนี้ เหตุใดจึงไม่เพิ่มรหัสปกติสำหรับ min-heap ฉันคิดว่าเป็นไปได้ที่จะทำเช่นนั้นใน O (ความสูง) โดยการสลับองค์ประกอบที่เพิ่มขึ้น (x) ซ้ำ ๆ โดยใช้ลูกน้อยที่สุดจนกว่าจะไม่มีลูกใดของมันใหญ่กว่า x เช่น IncreaseKey(int pos, int newValue) { heap[pos] = newValue; while(left(pos) &lt; heap.Length) { int smallest = left(pos); if(heap[right(pos)] &lt; heap[left(pos)]) smallest = right(pos); if(heap[pos] &lt; heap[smallest]) { swap(smallest, pos); pos= smallest; } else …

6
คิวลำดับความสำคัญสำหรับลำดับความสำคัญที่สั่งซื้อบางส่วนด้วย infima
ฉันมีวัตถุบางอย่างที่มีความสำคัญว่าเป็นประเภทสารประกอบและเป็นเพียงการสั่งซื้อบางส่วน ฉันจำเป็นต้องเลือกวัตถุตามลำดับความสำคัญนี้ (เช่นให้ผลผลิตน้อยที่สุดในแต่ละครั้ง) แต่แทนที่จะทำตามคำสั่งโดยพลการฉันจะชอบถ้าคิวนั้นมีความมั่นคงในแง่ที่ว่าถ้ามีองค์ประกอบขั้นต่ำมากกว่าหนึ่งชิ้นก็ควรคืนค่าที่เก่าที่สุดก่อน มีโครงสร้างข้อมูลฮีปใดบ้างที่สามารถใช้กับการสั่งซื้อบางส่วนได้ หรือการแก้ไขคิวลำดับความสำคัญปกติเพื่อทำงานกับมัน? ตัวเลือกทั่วไปสำหรับอัลกอริทึมที่ฉันต้องการคือไบนารีแบบง่ายหรือ 4-ary heap แต่ไม่สามารถใช้กับการสั่งซื้อบางส่วนได้ การสนับสนุนค่าลำดับความสำคัญ: ≼ ขข≼ ⋚ ̸ ข≼≼\preccurlyeqa≼ba≼ba \preccurlyeq bb≼ab≼ab \preccurlyeq aa⋚̸ba⋚̸ba \not\lesseqgtr b การค้นหาinfima (glb) และ suprema (lub) เป็นสูงสุดปีดังกล่าวว่าY \ preccurlyeq x_i คำนวณ infimum ของnค่าใช้เวลาO (n)เวลา มีค่าน้อยที่สุด (และสูงสุด) ของทุกชุดy y ≼ x i n O ( n )inf(xi)inf(xi)\inf(x_i)yyyy≼xiy≼xiy \preccurlyeq x_innnO(n)O(n)O(n) สามารถกำหนดส่วนขยายเชิงเส้นสำหรับการสั่งซื้อบางส่วนได้ …

2
วิธีการใช้อัลกอริทึม AO *
ฉันสังเกตเห็นว่ามีการใช้โครงสร้างข้อมูลที่แตกต่างกันเมื่อเราใช้อัลกอริทึมการค้นหา ตัวอย่างเช่นเราใช้คิวเพื่อดำเนินการค้นหาอย่างกว้างแรกวางซ้อนเพื่อใช้การค้นหาเชิงลึกครั้งแรกและ min-heaps เพื่อใช้อัลกอริทึม A *อัลกอริทึม ในกรณีเหล่านี้เราไม่จำเป็นต้องสร้างแผนผังการค้นหาอย่างชัดเจน แต่ฉันไม่สามารถหาโครงสร้างข้อมูลที่ง่ายต่อการจำลองขั้นตอนการค้นหาของAO * อัลกอริทึม ฉันอยากรู้ว่าการสร้างแผนผังการค้นหาเป็นวิธีเดียวที่จะใช้อัลกอริทึม AO * หรือไม่ ใครช่วยให้ฉันมีการใช้งานที่มีประสิทธิภาพ?

2
การพิสูจน์ฮีปไบนารีมี
ฉันพยายามที่จะพิสูจน์ว่ากองไบนารีที่มี nodes มีออกจากใบเนื่องจากกองถูกสร้างขึ้นด้วยวิธีต่อไปนี้:nnn⌈n2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil แต่ละโหนดใหม่จะถูกแทรกผ่านขึ้นกรอง ซึ่งหมายความว่าแต่ละโหนดใหม่จะต้องสร้างที่ลูกที่มีอยู่ถัดไป สิ่งที่ฉันหมายถึงคือเด็ก ๆ จะถูกเลื่อนระดับจากซ้ายไปขวา ตัวอย่างเช่นฮีปต่อไปนี้: 0 / \ 1 2 จะต้องมีการสร้างตามลำดับนี้: 0, 1, 2 (ตัวเลขเป็นเพียงดัชนีพวกเขาไม่ได้บ่งชี้ถึงข้อมูลจริงที่เก็บอยู่ในโหนดนั้น) สิ่งนี้มีนัยสำคัญสองประการ: ไม่มีโหนดใดในระดับไม่มีระดับที่เต็มไปอย่างสมบูรณ์k+1k+1k+1kkk เนื่องจากเด็กถูกสร้างจากซ้ายไปขวาจึงไม่มี "ช่องว่าง" ระหว่างโหนดในระดับหรือสถานการณ์ดังต่อไปนี้: k+1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (นี่จะเป็นฮีปที่ผิดกฎหมายตามคำจำกัดความของฉัน) ดังนั้นวิธีที่ดีที่จะคิดว่าฮีปนี้คือการใช้อาเรย์ของฮีปที่ไม่สามารถมี "การข้าม" ในอาเรย์ของอาร์เรย์ได้ ดังนั้นฉันคิดว่าอุปนัยอาจเป็นวิธีที่ดีในการทำสิ่งนี้ ... บางทีบางสิ่งบางอย่างที่ต้องจัดการกับแม้แต่กรณีแปลก ๆ สำหรับ n ตัวอย่างเช่นการเหนี่ยวนำโดยใช้ความจริงที่ว่าแม้กองที่สร้างขึ้นในแบบนี้จะต้องมีโหนดภายในที่มีลูกหนึ่งคนสำหรับคู่ n …

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

6
วิธีการใช้สองกองในหนึ่งแถว?
ฉันต้องการเริ่มด้วยการบอกว่านี่ไม่ใช่คำถามทำการบ้าน ฉันกำลังอ่านรู้เบื้องต้นเกี่ยวกับอัลกอริทึม - ข้อความ CLRS ที่มีชื่อเสียงที่จะกลายเป็นโปรแกรมเมอร์ที่ดีขึ้น ฉันพยายามที่จะแก้ปัญหาและการออกกำลังกายที่ได้รับในหนังสือด้วยตัวเอง ฉันพยายามที่จะแก้ปัญหาการออกกำลังกาย 10.1-2จากบทที่ 10 โครงสร้างข้อมูลพื้นฐานจาก CLRS Second Edition นี่คือสิ่งที่รัฐ: อธิบายวิธีการใช้สองกองในหนึ่งอาร์เรย์[1..n]ในลักษณะที่ไม่สแต็คล้นเว้นแต่จำนวนรวมขององค์ประกอบทั้งในกองด้วยกันคือn การผลักดันการดำเนินงานและ POP ควรทำงานในO (1)เวลา ทางออกที่ฉันเกิดขึ้นจนถึงตอนนี้คือ: ให้อาร์เรย์[1..n]ใช้สองกอง: S1 [1..i]และS2 [i..n] สำหรับการดำเนินการPUSH-S1และPUSH-S2หากสแต็ค 'เต็ม' จากนั้นเริ่มต้นการผลักองค์ประกอบเข้าสู่สแต็กอื่น ๆ (เช่นถ้าสแต็คS1เต็มเมื่อองค์ประกอบใหม่พยายามที่จะผลักดันเข้าไปแล้วผลักองค์ประกอบนั้นเข้าไป stack S2และในทางกลับกัน) ปัญหาของวิธีนี้คือฉันจะไม่สามารถใช้POP-S1หรือPOP-S2ได้อย่างน่าเชื่อถือเนื่องจากไม่มีวิธีการ 'จดจำ' องค์ประกอบใดที่เป็นของสแต็กใด หากองค์ประกอบของสแต็กเป็นคู่(คีย์, ค่า)คีย์คือหมายเลขสแต็กจากนั้นจึงปรากฏองค์ประกอบที่ฉันจะต้องค้นหาในกรณีที่เลวร้ายที่สุดฉันหรือ (ni) ครั้ง - ซึ่งจะเป็นO (n ) (รู้สึกอิสระที่จะถูกต้องฉันหากฉันผิดที่นี่) ซึ่งจะไม่เป็นO (1) ฉันต่อสู้กับคำถามมาระยะหนึ่งแล้ว ฉันกำลังติดตามใช่ไหม? ใครสามารถให้คำแนะนำที่เป็นไปได้สำหรับการแก้ไขปัญหานี้ได้บ้าง โดยทั่วไปแล้วฉันควร …

3
วิธีการเข้าถึงปัญหากราฟที่เกี่ยวข้องกับไดนามิก
ฉันถามคำถามนี้ที่ stackoverflow ทั่วไปและฉันถูกนำไปที่นี่ มันจะดีถ้ามีใครสามารถอธิบายวิธีการแก้ปัญหากราฟบางส่วนหรือแบบไดนามิกโดยทั่วไป ตัวอย่างเช่น: ค้นหาเส้นทางที่สั้นที่สุดระหว่างจุดยอดสองจุดในกราฟถ่วงน้ำหนักแบบไม่ระบุทิศทางสำหรับอินสแตนซ์เมื่อลบขอบที่แต่ละอินสแตนซ์( u , v )(ยู,โวลต์)(u,v)nnn ค้นหาจำนวนของส่วนประกอบที่เชื่อมต่อในกราฟที่ไม่ได้ทำการบอกทิศทางสำหรับอินสแตนซ์ n เมื่อขอบถูกลบในแต่ละอินสแตนซ์ ฯลฯ ฉันเพิ่งพบปัญหาประเภทนี้ในการแข่งขันเขียนโปรแกรม ฉันค้นหาในเว็บและฉันพบบทความวิจัยมากมายเกี่ยวกับกราฟไดนามิก [1,2] ฉันอ่านคู่ของพวกเขาและฉันไม่สามารถหาสิ่งใดตรงไปข้างหน้า (การจัดกลุ่มการแยกคำ ฯลฯ ) ขออภัยที่คลุมเครือ ฉันซาบซึ้งจริง ๆ ถ้าบางคนสามารถให้พอยน์เตอร์ให้เข้าใจแนวคิดเหล่านี้ได้ดีขึ้น อัลกอริทึมกราฟแบบไดนามิกโดย D. Eppstein, Z. Galil, GF Italiano (1999) เส้นทางที่สั้นที่สุดบนกราฟไดนามิกโดย G. Nannicini, L. Liberti (2008)

2
วิธีใดที่เหมาะสำหรับการจัดเก็บวัตถุทรงเรขาคณิตขนาดใหญ่ในควอดทรี
เมื่อวางวัตถุเรขาคณิตใน quadtree (หรือ octree) คุณสามารถวางวัตถุที่มีขนาดใหญ่กว่าโหนดเดี่ยวได้หลายวิธี: วางการอ้างอิงของวัตถุในทุก ๆ ใบไม้ที่มันมีอยู่ วางการอ้างอิงของวัตถุในโหนดที่ลึกที่สุดซึ่งมันมีอยู่อย่างสมบูรณ์ ทั้ง # 1 และ # 2 ตัวอย่างเช่น: ในภาพนี้คุณสามารถวางวงกลมในโหนดใบไม้ทั้งสี่ (วิธี # 1) หรือในเพียงแค่โหนดรูท (วิธี # 2) หรือทั้งสองอย่าง (วิธี # 3) สำหรับวัตถุประสงค์ในการสอบถามควอดทรีวิธีการใดเป็นเรื่องธรรมดามากขึ้นและทำไม?

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

6
การหาค่า XOR สูงสุดของตัวเลขสองตัวในช่วงเวลาหนึ่ง: เราจะทำได้ดีกว่าสมการกำลังสองหรือไม่?
สมมติว่าเรากำลังได้รับสองหมายเลขและและที่เราต้องการที่จะหาสำหรับL \ le i, \, J \ le Rlllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r อัลกอริทึมnaïveเพียงตรวจสอบคู่ที่เป็นไปได้ทั้งหมด เช่นในทับทิมเรามี: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j &gt; max) max = i ^ j end end end max end ฉันรู้สึกว่าเราสามารถทำได้ดีกว่าสมการกำลังสอง มีอัลกอริทึมที่ดีกว่าสำหรับปัญหานี้หรือไม่?

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