คำถามติดแท็ก complexity

ความซับซ้อนเกี่ยวข้องกับรูปแบบต่างๆของการคำนวณความซับซ้อนของรหัส ความซับซ้อนตามวัฏจักร, ความซับซ้อนของเส้นทาง n, เวลาบิ๊กโอและความซับซ้อนของพื้นที่

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

10
จะแยกความแตกต่างระหว่างซอฟต์แวร์ที่เป็นเรื่องเล็กน้อยและไม่เป็นเรื่องเล็กได้อย่างไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ดังนั้นสิ่งที่ทำให้โปรแกรมเล็กน้อยจริง ๆ ? 'เว้นแต่ซอฟต์แวร์ที่น่ารำคาญ' มักใช้ในการอภิปรายการเขียนโปรแกรม ฉันคิดว่ามันคลุมเครือมากในแง่ที่ว่าฉันไม่สามารถคิดได้ว่า 'บางสิ่งจำเป็นเพราะซอฟต์แวร์ที่ไม่สำคัญ' หรือ 'ซอฟต์แวร์ที่ไม่ใช่เรื่องเล็ก ๆ น้อย ๆ เพราะบางสิ่งมีความสำคัญมาก' ตัวอย่างเช่นคำถามเกี่ยวกับการทดสอบหน่วยเป็นจำนวนมากฉันได้ยิน 'ถ้าไม่สำคัญคุณต้องทดสอบหน่วย'
11 complexity 

2
การจัดการกับการแยกคุณลักษณะ
เมื่อเร็ว ๆ นี้ฉันได้เห็นปัญหาที่คล้ายกับปัญหาที่อธิบายไว้ในบทความนี้มากขึ้นเรื่อย ๆ อีกคำสำหรับมันคือสายผลิตภัณฑ์แม้ว่าฉันมักจะเชื่อว่าสิ่งเหล่านี้กับผลิตภัณฑ์ที่แตกต่างกันจริงในขณะที่ฉันมักจะพบปัญหาเหล่านี้ในรูปแบบของการกำหนดค่าผลิตภัณฑ์ที่เป็นไปได้ แนวคิดพื้นฐานของปัญหาประเภทนี้ง่ายมาก: คุณเพิ่มคุณสมบัติให้กับผลิตภัณฑ์ แต่อย่างใดสิ่งที่ซับซ้อนเนื่องจากการรวมกันของคุณสมบัติที่มีอยู่อื่น ๆ ในที่สุด QA พบปัญหากับชุดค่าผสมที่หายากซึ่งไม่มีใครคิดมาก่อนและสิ่งที่ควรเป็นตัวแก้ไขข้อบกพร่องอย่างง่าย ๆ ก็อาจกลายเป็นการต้องการการเปลี่ยนแปลงการออกแบบที่สำคัญ มิติของปัญหาการแยกคุณลักษณะนี้มีความซับซ้อนที่เหลือเชื่อ สมมติว่าเวอร์ชันซอฟต์แวร์ปัจจุบันมีNคุณสมบัติและคุณเพิ่มคุณสมบัติใหม่หนึ่งรายการ นอกจากนี้เราจะทำให้สิ่งต่าง ๆ ง่ายขึ้นด้วยการบอกว่าคุณลักษณะแต่ละอย่างสามารถเปิดหรือปิดได้เท่านั้นจากนั้นคุณ2^(N+1)มีการผสมผสานคุณสมบัติที่เป็นไปได้ที่จะต้องพิจารณา เนื่องจากการขาดการใช้ถ้อยคำที่ดีกว่า / คำค้นหา, ผมหมายถึงการดำรงอยู่ของชุดเหล่านี้เป็นปัญหาคุณลักษณะที่สี่แยก (คะแนนโบนัสสำหรับคำตอบรวมถึงการอ้างอิงสำหรับคำที่กำหนดขึ้น) ตอนนี้คำถามที่ฉันต่อสู้คือวิธีจัดการกับปัญหาความซับซ้อนนี้ในแต่ละระดับของกระบวนการพัฒนา สำหรับเหตุผลด้านราคาที่ชัดเจนมันเป็นไปไม่ได้จนถึงจุดที่เป็นอุดมคติที่ต้องการแยกแต่ละชุดค่าผสม ท้ายที่สุดเราพยายามหลีกเลี่ยงอัลกอริธึมที่ซับซ้อนแบบเอกซ์โปเนนเชียลเพื่อเหตุผลที่ดี แต่เพื่อเปลี่ยนกระบวนการพัฒนาให้กลายเป็นสัตว์ประหลาดขนาดเอ็กซ์โพเนนเชียล ดังนั้นคุณจะได้รับผลลัพธ์ที่ดีที่สุดในแบบที่เป็นระบบที่ไม่ระเบิดงบประมาณใด ๆ และเสร็จสมบูรณ์ในวิธีที่เหมาะสมมีประโยชน์และเป็นที่ยอมรับอย่างมืออาชีพ ข้อมูลจำเพาะ: เมื่อคุณระบุคุณลักษณะใหม่ - คุณจะมั่นใจได้อย่างไรว่ามันเล่นได้ดีกับเด็กคนอื่น ๆ ทั้งหมด? ฉันสามารถเห็นได้ว่ามีใครสามารถตรวจสอบแต่ละคุณลักษณะที่มีอยู่ร่วมกับคุณลักษณะใหม่อย่างเป็นระบบ แต่จะแยกคุณลักษณะอื่น ๆ เมื่อพิจารณาถึงลักษณะที่ซับซ้อนของคุณลักษณะบางอย่างมุมมองที่แยกได้นี้มักเกี่ยวข้องกันอยู่แล้วเพื่อให้ต้องการแนวทางแบบมีโครงสร้างในตัวเองโดยไม่คำนึงถึง2^(N-1)ปัจจัยที่เกิดจากคุณสมบัติอื่น ๆ ที่เราไม่สนใจ การติดตั้งใช้งาน: เมื่อคุณติดตั้งฟีเจอร์ - คุณจะมั่นใจได้อย่างไรว่าโค้ดของคุณโต้ตอบ / ตัดกันอย่างถูกต้องในทุกกรณี อีกครั้งฉันสงสัยเกี่ยวกับความซับซ้อนที่แท้จริง …

4
ลดความซับซ้อนของคลาส
ฉันได้ดูคำตอบและค้นหาใน Google แล้ว แต่ฉันไม่พบสิ่งที่เป็นประโยชน์ (เช่นนั่นจะไม่มีผลข้างเคียงที่น่าอึดอัดใจ) ปัญหาของฉันในเชิงนามธรรมคือฉันมีวัตถุและจำเป็นต้องดำเนินการลำดับที่ยาวนานของมัน ฉันคิดว่ามันเป็นสายการประกอบเช่นการสร้างรถ ผมเชื่อว่าวัตถุเหล่านี้จะเรียกว่าวิธีวัตถุ ดังนั้นในตัวอย่างนี้ในบางครั้งฉันจะมี CarWithoutUpholstery ซึ่งฉันจะต้องเรียกใช้ installBackSeat, installFrontSeat, installWoodenInserts (การดำเนินการไม่รบกวนซึ่งกันและกันและอาจทำได้ในแบบคู่ขนาน) การดำเนินการเหล่านี้ดำเนินการโดย CarWithoutUpholstery.worker () และให้ผลลัพธ์เป็นวัตถุใหม่ซึ่งจะเป็น CarWithUpholstery ซึ่งฉันจะเรียกใช้ cleanInsides (), validNoUpholsteryDefects () และอื่น ๆ การดำเนินงานในเฟสเดียวนั้นมีความเป็นอิสระอยู่แล้วเช่นฉันกำลังต่อสู้กับส่วนย่อยของพวกเขาที่อาจดำเนินการในลำดับใด ๆ (ที่นั่งด้านหน้าและด้านหลังอาจติดตั้งในลำดับใดก็ได้) ตรรกะของฉันในปัจจุบันใช้ Reflection เพื่อความง่ายในการใช้งาน นั่นคือเมื่อฉันมี CarWithoutUpholstery วัตถุจะตรวจสอบตัวเองสำหรับวิธีที่เรียกว่า performSomething () ณ จุดนั้นมันรันวิธีการเหล่านี้ทั้งหมด: myObject.perform001SomeOperation(); myObject.perform002SomeOtherOperation(); ... ในขณะที่ตรวจสอบข้อผิดพลาดและสิ่งต่างๆ ในขณะที่คำสั่งของการดำเนินงานเป็นสำคัญผมได้รับมอบหมายเพื่อทำพจนานุกรมในกรณีที่ผมเคยค้นพบคำสั่งบางเป็นสิ่งสำคัญหลังจากทั้งหมด สิ่งนี้ขัดแย้งกับYAGNIแต่มีค่าใช้จ่ายน้อยมาก - การเรียงลำดับแบบง่าย ๆ () …

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

6
อาร์กิวเมนต์ของฟิลด์เทียบกับวิธีการ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันเพิ่งเริ่มเขียนคลาสใหม่และมันเกิดขึ้นกับฉันว่าฉันได้เพิ่มการโต้แย้งวิธีที่ไม่จำเป็นอย่างเคร่งครัด สิ่งนี้กำลังติดตามพฤติกรรมเพื่อหลีกเลี่ยงการมีสถานะในคลาสที่เฉพาะเจาะจงกับการเรียกใช้เมธอดบางตัวแทนที่จะเป็นการกำหนดค่าทั่วไปหรือการพึ่งพาของคลาส การทำเช่นนั้นหมายความว่าวิธีการมากมายที่อาจไม่มีข้อโต้แย้งจบลงด้วยหนึ่งสองหรือสาม ฉันต้องการฟังความคิดเห็นของคุณเกี่ยวกับสิ่งที่คุณคิดเกี่ยวกับการแลกเปลี่ยนนี้และวิธีการตัดสินใจเกี่ยวกับวิธีการที่จะใช้ในสถานการณ์ใด เนื่องจากรหัสมักจะเข้าใจง่ายกว่าภาษาอังกฤษเมื่ออธิบายรหัสฉันจึงสร้างส่วนเล็กน้อยที่มีทั้งสองรูปแบบ: https://gist.github.com/JeroenDeDauw/6525656

3
วิธีทำให้คลาส stateful ที่ซับซ้อนและการทดสอบของพวกเขาง่ายขึ้น?
ฉันอยู่ในโครงการระบบกระจายเขียนด้วยภาษาจาวาที่เรามีบางคลาสที่สอดคล้องกับวัตถุในโลกธุรกิจจริงที่ซับซ้อนมาก วัตถุเหล่านี้มีวิธีการมากมายที่สอดคล้องกับการกระทำที่ผู้ใช้ (หรือตัวแทนอื่น ๆ ) อาจนำไปใช้กับวัตถุนั้น เป็นผลให้คลาสเหล่านี้ซับซ้อนมาก วิธีการสถาปัตยกรรมทั่วไปของระบบนำไปสู่พฤติกรรมจำนวนมากที่เน้นไปที่คลาสไม่กี่คลาสและสถานการณ์การโต้ตอบที่เป็นไปได้มากมาย ตัวอย่างและเพื่อให้สิ่งต่าง ๆ ง่ายและชัดเจนสมมติว่าหุ่นยนต์และรถยนต์เป็นชั้นเรียนในโครงการของฉัน ดังนั้นในคลาส Robot ฉันจะมีวิธีการมากมายในรูปแบบต่อไปนี้: นอน(); isSleepAvaliable (); ตื่น (); isAwakeAvaliable (); เดิน (Direction); isWalkAvaliable (); ยิง (Direction); isShootAvaliable (); turnOnAlert (); isTurnOnAlertAvailable (); turnOffAlert (); isTurnOffAlertAvailable (); ชาร์จ (); isRechargeAvailable (); ไฟดับ(); isPowerOffAvailable (); stepInCar (รถยนต์); isStepInCarAvailable (); stepOutCar (รถยนต์); …

5
การหมุนคำศัพท์เล็กที่สุดของสตริงโดยใช้อาร์เรย์ต่อท้ายใน O (n)
ฉันจะอ้างอิงปัญหาจาก ACM 2003: พิจารณาสตริงที่มีความยาว n (1 <= n <= 100000) กำหนดการหมุนเวียนคำศัพท์ขั้นต่ำสุด ตัวอย่างเช่นการหมุนของสตริง“ alabala” คือ: alabala labalaa abalaal balaala alaalab laalaba aalabal และที่เล็กที่สุดในหมู่พวกเขาคือ "aalabal" สำหรับวิธีการแก้ปัญหา - ฉันรู้ว่าฉันต้องสร้างอาร์เรย์ต่อท้าย - และสมมุติว่าฉันสามารถทำได้ใน O (n) คำถามของฉันคือฉันจะค้นหาการหมุนที่เล็กที่สุดใน O (n) ได้อย่างไร (n = ความยาวของสตริง) ฉันสนใจปัญหานี้มากและฉันก็ยังหาวิธีแก้ปัญหาไม่ได้ ฉันสนใจในแนวคิดและวิธีการแก้ไขปัญหามากกว่าการใช้งานอย่างเป็นรูปธรรม หมายเหตุ: การหมุนต่ำสุดหมายถึงในลำดับเดียวกันกับในพจนานุกรมภาษาอังกฤษ - "dwor" อยู่ก่อน "word" เพราะ d อยู่ก่อน w แก้ไข: …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.