โครงสร้างข้อมูลที่ซับซ้อนที่สุดที่คุณใช้ในสถานการณ์จริงคืออะไร? [ปิด]


17

เชื้อโรคสำหรับคำถามนี้เกิดขึ้นจากการสนทนาที่ฉันมีกับนักพัฒนาเพื่อนสองคนจากอุตสาหกรรม

ปรากฎว่าในหลาย ๆ ที่ผู้จัดการโครงการมีความระมัดระวังเกี่ยวกับโครงสร้างข้อมูลที่ซับซ้อนและโดยทั่วไปยืนยันในสิ่งที่มีอยู่นอกกรอบจากไลบรารี / แพ็คเกจมาตรฐาน แนวคิดทั่วไปดูเหมือนจะเป็นเหมือนการใช้การรวมกันของสิ่งที่มีอยู่แล้วยกเว้นว่าประสิทธิภาพการทำงานจะถูกขัดขวางอย่างจริงจัง สิ่งนี้ช่วยให้การรักษารหัสพื้นฐานง่ายขึ้นซึ่งไม่ใช่การทูตหมายถึง "เรามีการขัดสีสูงและการจ้างงานใหม่ที่เราจ้างอาจไม่ดีเท่านี้"

ดังนั้นจึงไม่มีการคัดกรองบลูมหรือข้ามรายการหรือสเปรย์ต้นไม้สำหรับคุณ CS ขยะ ดังนั้นนี่คือคำถาม (อีกครั้ง): โครงสร้างข้อมูลที่ซับซ้อนที่สุดที่คุณทำหรือใช้ในสำนักงานคืออะไร

ช่วยให้เข้าใจว่าซอฟต์แวร์โลกแห่งความจริงที่ดี / ซับซ้อนเพียงใด


เขียนโดยคนอื่นหรือด้วยตัวเราเอง?

ความตั้งใจดั้งเดิมของฉันคือสิ่งที่ตัวเองพัฒนา แต่ฉันคิดว่ามันเพิ่มมิติที่น่าสนใจให้กับคำถาม แก้ไขคำถามเดิม
Fanatic23

การทำให้มันซับซ้อนไม่ได้หมายความว่ามันซับซ้อน Simpler = ดีกว่าเสมอ
tp1

สิ่งที่ซับซ้อนที่สุดนั้นมีอยู่เสมอจาก STL ความซับซ้อนมักมาจากโครงสร้างข้อมูลที่ซ้อนกันไม่ใช่จากชนิดข้อมูล โครงสร้างที่เรียบง่าย = ดีเว้นแต่ profiler บ่น
Coder

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

คำตอบ:


7

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


7

ฉันเป็นผู้พัฒนา Java Java Collection Frameworkสามารถแก้ปัญหาโครงสร้างข้อมูล 90% ของฉันได้อีก 10% ต้องการความพยายาม ฉันคิดว่าถ้าคุณเข้าใจ lib มาตรฐานที่ซับซ้อนที่เขียนโดยผู้เชี่ยวชาญคุณจะพบว่าพวกเขาช่วยได้ในกรณีส่วนใหญ่

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

ถ้าฉันต้องเขียนโครงสร้างข้อมูลที่ซับซ้อนฉันจะหยิบตำราเรียน :)


4

โครงสร้างข้อมูลที่ซับซ้อนที่สุดที่ฉันเคยใช้กับงานคือ trie อย่างไรก็ตามเมื่อยี่สิบปีที่แล้ว

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

การขาดความรู้ทั่วไป CompSci ในอุตสาหกรรมเป็นปัญหาร้ายแรง ตัวอย่างเช่นฉันได้สูญเสียจำนวนนักพัฒนาซอฟต์แวร์ที่ฉันได้พบผู้ที่ไม่เข้าใจนิพจน์เช่น! (a! = 5 && b! = 3) และ a == 5 || b == 3 มีค่าเทียบเท่าเชิงตรรกะ ทุกคนที่รู้วิธีใช้ทฤษฎีบทของ DeMorgan สามารถรับรู้ได้ว่าการแสดงออกเหล่านี้เทียบเท่ากับเหตุผล บัณฑิตที่ไม่ใช่ CompSci ส่วนใหญ่ไม่เคยได้ยินทฤษฎีบท DeMorgan มาก่อน หากมีการสำรวจฐานรหัสที่สำคัญใด ๆ จะพบว่ามีนิพจน์จำนวนมากที่ลบล้างนิพจน์ย่อยเชิงลบ ความสามารถในการอ่านของรหัสที่ประกอบด้วยนิพจน์ย่อยเชิงลบที่ถูกลบจะถูกปรับปรุงให้ดีขึ้นเกือบตลอดเวลาโดยการแปลงนิพจน์เหล่านี้ให้อยู่ในรูปแบบที่ไม่ได้ถูกปฏิเสธ


5
คำแนะนำของฉันให้กับทุกคนที่ลงคะแนน "ลง" คือควรเพิ่มความคิดเห็นเพื่อระบุว่าทำไมคน ๆ หนึ่งถึงลงคะแนน "ลง" ฉันสามารถจัดการกับคนที่มีความคิดเห็นที่แตกต่าง อย่างไรก็ตามสิ่งที่ฉันไม่สามารถจัดการได้คือความขี้ขลาด
bit-twiddler

2
@ bit-twiddler ฉันได้เรียนรู้ทฤษฎีบท De Morgan ในระดับปรัชญาของฉัน ตอนนี้ฉันกำลังทำ CS มันไม่ได้พูดถึง แม้ว่าโดยสุจริตฉันเห็นสิ่งต่าง ๆ เหล่านี้เป็นชวเลขที่ดีที่สุดมาพร้อมกับประสบการณ์ คุณจำเป็นต้องจำกฎจริงๆ (และตามชื่อ!) ที่คุณใช้เมื่อแยกตัวประกอบสมการออกไหม ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันทำมันออกมาจากสิ่งที่อยู่ตรงหน้าฉันและไม่ใช่ด้วยการท่องจำ เช่นเดียวกับการแก้ไขนิพจน์เชิงตรรกะ
Rupert Madden-Abbott

2
@Rupert: ทฤษฎีบทของ De Morgan มักจะครอบคลุมในการคำนวณแบบไม่ต่อเนื่องและการจัดระเบียบคอมพิวเตอร์ ฉันมุ่งเน้นไปที่สถาปัตยกรรมคอมพิวเตอร์ / ซอฟต์แวร์ระบบเป็นระดับปริญญาตรี ทฤษฎีบทของเดอร์แกนถูกใช้อย่างหนักในการออกแบบลอจิกแบบดิจิตอล มีพื้นที่ในการพัฒนาซอฟต์แวร์ระดับต่ำซึ่งการรู้ทฤษฎีบทของเดอมอร์แกนกลายเป็นสิ่งสำคัญ ตัวอย่างเช่นมีคอมพิวเตอร์ชุดคำสั่งน้อยที่สุดที่ไม่มีชุดคำสั่งบูลีนแบบเต็ม ดังนั้นหนึ่งจะต้องสามารถได้รับการดำเนินการบูลีนหนึ่งจากที่อื่น
bit-twiddler

1
(ต่อ) นี่คือการทดสอบที่ไม่ใช่วิทยาศาสตร์คอมพิวเตอร์ / วิศวกรรมคอมพิวเตอร์ / วิศวกรรมไฟฟ้า (ความเข้มข้นของวิศวกรรมคอมพิวเตอร์) ส่วนใหญ่จบไม่ว่าจะตรงไปตรงมาหรือใช้เวลาตอบนาน รับเฉพาะการดำเนินการ NAND (ลบ) รับการดำเนินการบูลีนต่อไปนี้: NOT, AND, OR, NOR, XOR และ XNOR การรู้ทฤษฎีของเดอมอร์แกนทำให้การดำเนินการบูลีนทั้งหกนั้นง่ายขึ้นมาก ทฤษฎีบทของเดอร์แกนเป็นทฤษฎีบทที่สำคัญที่สุดในการออกแบบลอจิกแบบดิจิทัลอย่างง่ายดาย
bit-twiddler

1
..... ถึงแม้ว่าจะยุติธรรม แต่ในอุตสาหกรรมที่มีงานจำนวนมากเข้ามาเขียนแอป RoR แบบครึ่งทางสำหรับธุรกิจขนาดเล็กบางอย่างอาจมีประมาณ 1 ครั้งใน 100,000 ล้านที่คุณจะต้องมี HEARD of แนวคิดของประตูตรรกะและพีชคณิตแบบบูลแทนที่จะแค่รู้ความหมายของคำภาษาอังกฤษ "หรือ" และ "และ" และ " ไม่ได้บอกว่าสิ่งเหล่านี้ไม่เกี่ยวข้องกับการรู้ว่าคุณกำลังทำงาน CS หรืออัลกอริทึมที่ซับซ้อนหรือการเพิ่มประสิทธิภาพหรือการเขียนโปรแกรมระดับต่ำ แต่สำหรับคนส่วนใหญ่ที่ทำงานเป็นโปรแกรมเมอร์มันเป็นเรื่องไม่สำคัญไร้ประโยชน์
sara

2

ฉันเคยเขียนคิวปฏิทิน (O (1) ลำดับความสำคัญคิว) สำหรับการจำลองตามเหตุการณ์ซึ่งการทำโปรไฟล์แสดงให้เห็นว่า heap ที่มีอยู่เป็นคอขวด

ฉันยังปล่อยผลิตภัณฑ์ที่มีเครื่องสถานะ จำกัด ด้วยสถานะประมาณ 80000 - รหัสเพื่อสร้างมันเป็นบิตเที่ยวยุ่งยิ่งที่จะพูดอย่างน้อย


2

นานมาแล้วในกาแลคซี ... ทำงานกับทีมที่ใช้ "บัดดี้บัฟเฟอร์" ของ Knuth ใน RTOS ในแอสเซมเบลอร์

นอกจากนี้เกมแห่งชีวิตของ Conway ที่มี 256 รุ่นสำหรับโลกแห่ง 1024 x 1024


1

ไม่ได้ใช้จริงๆอะไรเป็นพิเศษเกินไปจากรอยขีดข่วนก็จะเป็นรายการที่เชื่อมโยงเป็นทวีคูณ

ไม่น่าตื่นเต้นมากฉันใช้โครงสร้างอื่น แต่คำถามของคุณพูดตั้งแต่เริ่มต้น


ใน C ++ นั่นคือstd::listและไม่มีอะไรซับซ้อนเลย: / ฉันพบต้นไม้สีแดงดำ / AVL ต้นไม้มีความซับซ้อนมากขึ้นโดยมีเงื่อนไขการปรับสมดุลเหล่านั้นทั้งหมด!
Matthieu M.

@Mathieu std :: map และคุณมักจะได้ต้นไม้ rb
aufather

1

ต้นไม้แฮชเทเบิลที่มีรายการข้อมูลทางการเงินทั่วไปไม่ต้องถาม บางครั้งฉันก็หวังว่าฉันจะเป็นคาวบอย อาชีวิตเรียบง่ายใต้แสงดาว ...


ลบแว่นตา "Dear God."
เลนโจเซฟ

1

ฉันต้องเขียนโครงสร้างรายการที่เชื่อมโยงสองมิติแบบวงกลมตั้งแต่เริ่มต้นสำหรับขั้นตอนวิธีการเชื่อมโยงการเต้นสำหรับนักแก้ปัญหา Sudoku รู้สึกเหมือนได้ออกแบบลูกบาศก์ของรูบิค โครงสร้างทั้งหมดนั้นเป็นรายการของรายการ - โดยแต่ละโหนดชี้ไปที่สี่รายการ


1
ฟังดูเกินความจริงสำหรับนักแก้ปัญหา Sudoku เนื่องจากอัลกอรึทึมการย้อนรอยที่โหดเหี้ยมแก้ปริศนาได้เร็วกว่าที่คุณป้อนข้อมูล
วินไคลน์

3
@ เควิน, การเต้นรำเป็นอัลกอริทึมย้อนรอยย้อนรอย - แต่ด้วยวิธีแก้ปัญหาที่เป็นไปได้
Peter Taylor

คุณต้องมีฮิวริสติกหากคุณกำลังทำสิ่งต่าง ๆ เช่นระบุจำนวนโซลูชั่นทั้งหมดและยืนยันว่า Sudoku มีโซลูชันที่ไม่ซ้ำกันเพียง 1 รายการเท่านั้น
ProdigySim


0

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

วันนี้ฉันแทบจะไม่สร้างโครงสร้างข้อมูลแฟนซีใด ๆ ส่วนใหญ่เกิดขึ้นในฐานข้อมูลที่คุณตัดสินใจว่าคุณใส่อะไรลงไปในตารางบางทีค่าที่คำนวณล่วงหน้าอาจเป็น ID ของระเบียนที่เกี่ยวข้องบางอย่างสำหรับการดึงข้อมูลอย่างรวดเร็วเพื่อหลีกเลี่ยงการค้นหาที่ไม่จำเป็น

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


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

0

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

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

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

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