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

คำถามเกี่ยวกับการจัดเก็บอย่างมีประสิทธิภาพและการแสดงข้อมูลภายในแอปพลิเคชันซอฟต์แวร์

2
คำว่า "ต้นไม้สีแดง / ดำ" มาจากไหน
แดง / ดำต้นไม้เป็นวิธีหนึ่งที่จะใช้ค้นหาต้นไม้ไบนารีสมดุล หลักการที่อยู่เบื้องหลังว่ามันทำงานได้เหมาะสมกับฉัน แต่สีที่เลือกไม่ได้ ทำไมสีแดงและดำตรงข้ามกับสีอื่น ๆ หรือคุณลักษณะโดยทั่วไป? เมื่อฉันได้ยิน "แดงและดำ" สิ่งแรกที่นึกถึงก็คือกระดานตรวจสอบและLes Misérablesซึ่งทั้งสองอย่างนี้ดูเหมือนจะไม่สามารถใช้ได้ในบริบทนี้

10
ฉันจะเรียนรู้อัลกอริทึมและโครงสร้างข้อมูลได้อย่างไร [ปิด]
นี่คือความต่อเนื่องของคำถามก่อนหน้าของฉันที่ฉันถามมันจำเป็นต้องเรียนรู้อัลกอริทึมและโครงสร้างข้อมูล ฉันรู้สึกว่าใช่ ตอนนี้ฉันทำงานในสภาพแวดล้อมที่ฉันจะไม่ได้รับโอกาสที่จะเรียนรู้มันโดยการทดลองหรือปฏิบัติหรือในการมอบหมายใด ๆ อะไรคือแนวทางที่ถูกต้องเช่นหนังสือที่ถูกต้องปัญหาที่เหมาะสมประเภทของทรัพยากรที่ฉันสามารถผ่านเพื่อให้เวลาหกเดือนหรือหนึ่งปีหรือสองปีเพื่อเรียนรู้อัลกอริทึมและโครงสร้างข้อมูล และสร้างความคิดของฉันในแบบที่มันสามารถเชื่อมโยงปัญหากับโครงสร้างข้อมูลและอัลกอริทึม

8
ควรใช้ DAG (Directed Acyclic Graph) ในการเขียนโปรแกรมเมื่อใด
ฉันเพิ่งพบกรอบชื่อecto ในเฟรมเวิร์กนี้ส่วนประกอบพื้นฐานที่ชื่อว่า"พลาสม่า"ซึ่งเป็นกราฟเชิงเส้นกำกับของ ecto ใน ecto พลาสซึมสามารถดำเนินการได้โดยตัวจัดตารางเวลาของ ecto ฉันสงสัยว่ากลไกนี้มีประโยชน์อย่างไรและในสถานการณ์อื่นใดที่เราสามารถใช้ประโยชน์จากแนวคิดของ DAG ได้?

12
ฉันจำเป็นต้องเข้าใจอัลกอริทึมและโครงสร้างข้อมูลเพื่อที่จะเรียกว่าโปรแกรมเมอร์หรือไม่? [ปิด]
หกปีแล้วที่ฉันเขียนโปรแกรม การเขียนโค้ดลงในทุกสิ่งเช่น ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP และอื่น ๆ ฉันใช้อาร์เรย์, แผนที่, รายการที่เชื่อมโยง, ชุด, ฯลฯ ทุกที่ที่ฉันทำงานคนเช่นฉัน แต่เมื่อใดก็ตามที่ฉันสัมภาษณ์มันมีโอกาสมากที่ผู้คนจะถามฉันเกี่ยวกับแฮชต้นไม้กองและคิว คำถามบางข้อเกี่ยวกับการเล่นกลอัลกอริทึมการเรียงลำดับ ฉันไม่รู้ว่าควรจะรู้จักพวกเขาจริง ๆ หรือฉันควรหยุดเรียกตัวเองว่าเป็นโปรแกรมเมอร์ มีบางอย่างในตัวฉันที่บอกฉันด้วยถึงแม้ว่าคนที่ถามคำถามเหล่านี้ทั้งหมดจะเลือกฉันพวกเขาจะไม่ทำให้ฉันทำงานกับสิ่งเหล่านี้ ฉันจำเป็นต้องรู้ทั้งหมดนี้จริง ๆ หรือไม่

2
PHP: จะใช้อาร์เรย์เมื่อใดและเมื่อใดที่จะใช้วัตถุสำหรับการสร้างรหัสเก็บข้อมูลส่วนใหญ่
PHP เป็นภาษากระบวนทัศน์ผสมอนุญาตให้ใช้และส่งคืนชนิดข้อมูลที่ไม่ใช่วัตถุเช่นอาร์เรย์ ฉันถามคำถามเพื่อพยายามอธิบายแนวทางบางอย่างสำหรับการเลือกอาร์เรย์กับวัตถุเมื่อตัดสินใจเลือกสิ่งที่โปรแกรมสร้างขึ้นเพื่อใช้ในสถานการณ์เฉพาะ นี่เป็นคำถามเกี่ยวกับวิธีการเข้ารหัสข้อมูลโดยใช้การสร้างภาษา PHP และเมื่อมีวิธีหนึ่งที่น่าจะเลือกมากกว่าเพื่อการส่งผ่านข้อมูล (เช่น Service-Oriented Architecture หรือบริการบนเว็บ) ตัวอย่าง สมมติว่าคุณมีประเภทรายการประกอบด้วย {cost, name, part_number, item_count} โปรแกรมของคุณเรียกร้องให้แสดงประเภทรายการดังกล่าวหลายประเภทซึ่งคุณต้องการใช้อาร์เรย์เป็นที่เก็บด้านนอกเพื่อเก็บรายการแต่ละประเภทไว้ [คุณยังสามารถใช้ PHP เป็นArrayObjectสำหรับกระบวนทัศน์ OO แต่คำถามของฉันไม่เกี่ยวกับการที่ (นอก) อาร์เรย์] คำถามของฉันเกี่ยวกับวิธีเข้ารหัสข้อมูลประเภทรายการและเกี่ยวกับกระบวนทัศน์ที่จะใช้ PHP ช่วยให้คุณใช้หรือPHP Native ArraysPHP Objects ฉันสามารถเข้ารหัสข้อมูลดังกล่าวได้สองวิธีดังนี้: //PHP's associative arrays: $ret = array( 0 => array( 'cost' => 10.00, 'name' => 'item1', 'part_number' => 'zyz-100', 'item_count' …

3
ความแตกต่างระหว่างฮีปและคิวลำดับความสำคัญ
ผมคิดเสมอว่ากองที่และคิวลำดับความสำคัญเป็นคำพ้อง - โครงสร้างข้อมูลนามธรรมที่สนับสนุนinsert, findMinและdeleteMinการดำเนินงาน วรรณกรรมบางเล่มดูเหมือนจะเห็นด้วยกับฉัน - ตัวอย่างโครงสร้างข้อมูลที่ใช้งานได้อย่างแท้จริงของ Chris Okasaki (บทที่ 3) ในทางกลับกันฮีปเพจของวิกิพีเดียกำหนดว่าเป็นโครงสร้างข้อมูลแบบทรีและระบุว่า heaps เป็นการใช้คิวงานที่มีลำดับความสำคัญสูง ฉันมีความยากลำบากในการคืนดีกับความจริงที่ว่าฉันสามารถคิดถึงการใช้ฮีปมากกว่าหนึ่งครั้ง - กองซ้ายกองซ้อนทวิทวิสเปรย์กอง ... ความจริงง่ายๆที่ heap สามารถนำไปใช้กับโครงสร้างข้อมูลที่แตกต่างกันไม่ได้หมายความว่าตามนิยามแล้วมันเป็นโครงสร้างข้อมูลนามธรรมหรือไม่? และถ้าเป็นเช่นนั้นจะมีความแตกต่างจริงกับลำดับความสำคัญหรือไม่

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

10
อะไรคือจุดใช้ของรายการเหนือเวคเตอร์ใน C ++?
ฉันใช้การทดลอง 3 แบบที่เกี่ยวข้องกับรายการ C ++ และเวกเตอร์ ผู้ที่มีเวกเตอร์พิสูจน์ได้ว่ามีประสิทธิภาพมากขึ้นแม้ว่าจะมีการแทรกอยู่ตรงกลางจำนวนมาก ดังนั้นคำถาม: ในกรณีใดรายการที่มีเหตุผลมากกว่าเวคเตอร์? หากเวกเตอร์ดูเหมือนจะมีประสิทธิภาพมากขึ้นในกรณีส่วนใหญ่และพิจารณาว่าสมาชิกของพวกเขาเหมือนกันแล้วจะมีข้อได้เปรียบอะไรที่เหลืออยู่สำหรับรายการ? สร้างจำนวนเต็ม N และวางไว้ในคอนเทนเนอร์เพื่อให้คอนเทนเนอร์ยังคงเรียงลำดับ การแทรกได้รับการดำเนินการอย่างไร้เดียงสาโดยการอ่านองค์ประกอบทีละหนึ่งและแทรกใหม่ขวาก่อนที่จะมีขนาดใหญ่ขึ้นครั้งแรก ด้วยรายการเวลาจะผ่านหลังคาเมื่อมิติเพิ่มขึ้นเมื่อเทียบกับเวกเตอร์ แทรกจำนวนเต็ม N ที่ส่วนท้ายของคอนเทนเนอร์ สำหรับรายการและเวกเตอร์เวลาเพิ่มขึ้นตามลำดับความสำคัญเท่ากันแม้ว่ามันจะเร็วขึ้น 3 เท่าเมื่อใช้เวกเตอร์ แทรกจำนวนเต็ม N ในคอนเทนเนอร์ เริ่มจับเวลา เรียงลำดับคอนเทนเนอร์โดยใช้ list.sort สำหรับรายการและ std :: sort สำหรับเวกเตอร์ หยุดจับเวลา อีกครั้งเวลาเพิ่มขึ้นตามลำดับความสำคัญเท่ากัน แต่มันจะเร็วขึ้นโดยเฉลี่ย 5 เท่าด้วยเวกเตอร์ ฉันอาจทำการทดสอบต่อไปและหาตัวอย่างสองสามข้อที่รายการจะพิสูจน์ได้ดีขึ้น แต่ประสบการณ์ร่วมกันของพวกคุณที่อ่านข้อความนี้อาจให้คำตอบที่มีประสิทธิผลมากขึ้น คุณอาจเจอสถานการณ์ที่รายการใช้งานได้สะดวกกว่าหรือทำได้ดีกว่า

4
ประเภทข้อมูลบทคัดย่อและโครงสร้างข้อมูล
มันค่อนข้างยากสำหรับฉันที่จะเข้าใจเงื่อนไขเหล่านี้ ฉันค้นหาใน google และอ่านวิกิพีเดียเล็กน้อย แต่ก็ยังไม่แน่ใจ ฉันตัดสินใจแล้วว่า: Abstract Data Typeเป็นคำนิยามของชนิดใหม่อธิบายคุณสมบัติและการดำเนินงานของมัน โครงสร้างข้อมูลเป็นการใช้งาน ADT ADT หลายตัวสามารถนำไปใช้กับโครงสร้างข้อมูลเดียวกันได้ ถ้าฉันคิดว่าถูกต้องอาเรย์เป็น ADT หมายถึงการรวบรวมองค์ประกอบและเป็นโครงสร้างข้อมูลการจัดเก็บในหน่วยความจำ สแต็คคือ ADT ที่มีการดำเนินการแบบพุชและป๊อป แต่เราสามารถพูดเกี่ยวกับโครงสร้างข้อมูลสแต็คได้หรือไม่ถ้าฉันหมายความว่า และทำไมฮีปจึงไม่ใช่ ADT มันสามารถนำมาใช้เป็นต้นไม้หรืออาร์เรย์

7
วิธีการค้นหารายการสตริง / ระเบียนที่มีขนาดใหญ่มากอย่างรวดเร็วบนฐานข้อมูล
ฉันมีปัญหาดังต่อไปนี้: ฉันมีฐานข้อมูลที่มีมากกว่า 2 ล้านบันทึก แต่ละระเบียนมีเขตข้อมูลสตริง X และฉันต้องการแสดงรายการของระเบียนที่เขตข้อมูล X ประกอบด้วยสตริงที่แน่นอน แต่ละระเบียนมีขนาดประมาณ 500 ไบต์ เพื่อให้เป็นรูปธรรมมากขึ้น: ใน GUI ของแอปพลิเคชันของฉันฉันมีช่องข้อความที่ฉันสามารถป้อนสตริงได้ ด้านบนของฟิลด์ข้อความฉันมีตารางที่แสดงเรคคอร์ด (N แรกเช่น 100) ที่ตรงกับสตริงในฟิลด์ข้อความ เมื่อฉันพิมพ์หรือลบอักขระหนึ่งตัวในฟิลด์ข้อความเนื้อหาของตารางจะต้องได้รับการอัปเดตทันที ฉันสงสัยว่ามีวิธีที่มีประสิทธิภาพในการทำเช่นนี้โดยใช้โครงสร้างดัชนีที่เหมาะสมและ / หรือแคช ตามที่อธิบายไว้ข้างต้นฉันต้องการแสดงเฉพาะรายการแรกที่ตรงกับแบบสอบถาม ดังนั้นสำหรับ N ที่มีขนาดเล็กพอก็ไม่ควรเป็นปัญหาใหญ่ในการโหลดไอเท็มที่ตรงกันจากฐานข้อมูล นอกจากนี้การแคชรายการในหน่วยความจำหลักสามารถทำให้การดึงข้อมูลเร็วขึ้น ฉันคิดว่าปัญหาหลักคือวิธีค้นหารายการที่ตรงกันอย่างรวดเร็วโดยกำหนดสตริงรูปแบบ ฉันสามารถใช้สิ่งอำนวยความสะดวกบางอย่างของ DBMS หรือฉันต้องสร้างดัชนีในหน่วยความจำด้วยตัวเองบ้างไหม? ความคิดใด ๆ แก้ไข ฉันได้ทำการทดลองครั้งแรก ฉันแบ่งระเบียนออกเป็นไฟล์ข้อความต่างๆ (ไม่เกิน 200 รายการต่อไฟล์) และวางไฟล์ในไดเรกทอรีต่าง ๆ (ฉันใช้เนื้อหาของเขตข้อมูลเดียวเพื่อกำหนดโครงสร้างไดเรกทอรี) ฉันจบด้วยไฟล์ประมาณ 50,000 ไฟล์ในไดเรกทอรีประมาณ 40000 ฉันได้เรียกใช้ …

8
เป็นวิธีปฏิบัติที่ดีหรือไม่ที่จะใช้ชนิดข้อมูลที่เล็กลงสำหรับตัวแปรเพื่อบันทึกหน่วยความจำ?
เมื่อฉันเรียนรู้ภาษา C ++ เป็นครั้งแรกที่ฉันได้เรียนรู้ว่านอกเหนือจาก int, float ฯลฯ รุ่นข้อมูลขนาดเล็กหรือใหญ่กว่านั้นมีอยู่ในภาษา ตัวอย่างเช่นฉันสามารถเรียกตัวแปร x int x; or short int x; ความแตกต่างที่สำคัญคือการที่ short int ใช้หน่วยความจำ 2 ไบต์ในขณะที่ int ใช้ 4 ไบต์และ short int มีค่าน้อยกว่า แต่เราสามารถเรียกสิ่งนี้ว่าทำให้มันเล็กลงได้: int x; short int x; unsigned short int x; ซึ่ง จำกัด มากยิ่งขึ้น คำถามของฉันคือถ้าเป็นแนวปฏิบัติที่ดีที่จะใช้ชนิดข้อมูลแยกต่างหากตามค่าตัวแปรที่คุณใช้ภายในโปรแกรม เป็นความคิดที่ดีที่จะประกาศตัวแปรตามชนิดข้อมูลเหล่านี้หรือไม่?

8
รายชื่อพจนานุกรม
ดังนั้นฉันจึงเจองานDictionary<int, int>วันนี้ สิ่งนี้ดูแปลกสำหรับฉันเพราะฉันอาจจะใช้List<int>แทน มีความแตกต่างและจะมีกรณีการใช้งานที่โครงสร้างหนึ่งจะเป็นที่ต้องการมากกว่าอีกหรือไม่

5
วิธีที่มีประสิทธิภาพมากที่สุดในการจัดเก็บช่วงตัวเลขคืออะไร
คำถามนี้เกี่ยวกับจำนวนบิตที่ต้องใช้ในการจัดเก็บช่วง หรือใส่อีกวิธีหนึ่งสำหรับจำนวนบิตที่กำหนดช่วงสูงสุดที่สามารถจัดเก็บได้คือเท่าใด ลองนึกภาพเราต้องการเก็บช่วงย่อยภายในช่วง 0-255 ตัวอย่างเช่น 45-74 เราสามารถเก็บตัวอย่างด้านบนเป็นสองไบต์ที่ไม่ได้ลงชื่อ แต่มันทำให้ฉันรู้สึกว่าต้องมีข้อมูลซ้ำซ้อน เรารู้ว่าค่าที่สองมีขนาดใหญ่กว่าค่าแรกดังนั้นในกรณีที่ค่าแรกมีขนาดใหญ่จำเป็นต้องใช้บิตที่น้อยกว่าสำหรับค่าที่สองและในกรณีที่ค่าที่สองมีขนาดใหญ่จำเป็นต้องใช้บิตที่น้อยกว่าสำหรับครั้งแรก . ฉันสงสัยว่าเทคนิคการบีบอัดใด ๆ จะให้ผลลัพธ์ที่ได้เล็กน้อยดังนั้นจึงอาจเป็นคำถามที่ดีกว่าที่จะถาม "ช่วงสูงสุดที่สามารถเก็บไว้ในไบต์เดียวคืออะไร" นี่ควรใหญ่กว่าสิ่งที่ทำได้โดยจัดเก็บตัวเลขสองตัวแยกกัน มีอัลกอริธึมมาตรฐานสำหรับการทำสิ่งนี้หรือไม่?

7
ฉันควรลงทุนในโครงสร้างข้อมูลและอัลกอริทึมต่อไปหรือไม่ [ปิด]
วันนี้ฉันลงทุนอย่างมากในโครงสร้างข้อมูลและอัลกอริทึมและพยายามแก้ปริศนาการเขียนโปรแกรมบางอย่าง ฉันพยายามเขียนโปรแกรมและแก้ปัญหาด้วย Java และ Clojure ฉันจะเสียเวลาหรือเปล่า? ฉันควรลงทุนในเทคโนโลยีและกรอบการทำงานที่ฉันรู้แล้วเพื่อให้ได้ความรู้ที่ลึกซึ้งยิ่งขึ้น (รายละเอียดและลึกหนาบาง) และสามารถใช้รหัสกับพวกเขาได้เร็วขึ้น? จากการศึกษาโครงสร้างข้อมูลและอัลกอริธึมฉันจะกลายเป็นโปรแกรมเมอร์ที่ดีขึ้นหรือวิชาเหล่านั้นมีความสำคัญในช่วงปีการศึกษา?

3
มีความแตกต่างอะไรระหว่างการใช้ struct และ std :: pair
ฉันเป็นโปรแกรมเมอร์ C ++ ที่มีประสบการณ์ จำกัด สมมติว่าฉันต้องการใช้STL mapเพื่อจัดเก็บและจัดการกับข้อมูลบางอย่างฉันต้องการทราบว่ามีความแตกต่างที่มีความหมาย (ในประสิทธิภาพ) ระหว่างโครงสร้างข้อมูล 2 วิธี: Choice 1: map<int, pair<string, bool> > Choice 2: struct Ente { string name; bool flag; } map<int, Ente> โดยเฉพาะมีค่าใช้จ่ายใด ๆ ที่ใช้structแทนง่ายpairหรือไม่

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