ปัญหาการเขียนโปรแกรมปัญหาปัญหาอัลกอริทึมทั้งหมดหรือไม่ [ปิด]


13

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

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

ฉันไม่ได้ใช้โปรแกรมที่ซับซ้อนมากมายกับ GUI, AI, กราฟิกและอื่น ๆ แต่ปัญหาเหล่านี้เป็นปัญหาของการคิดอัลกอริทึมที่ดีหรือไม่?


6
ปัญหาที่พบบ่อยที่สุดสำหรับโปรแกรมเมอร์ imho คือ: "โอ้นั่นคือสิ่งที่คุณหมายถึงหรือไม่ตอนนี้ฉันเข้าใจแล้วมันไม่ใช่สิ่งที่ฉันนำมาใช้ขอโทษ" นั่นคือปัญหาการเขียนโปรแกรมหรือไม่?
keppla

1
คำถาม นี้คล้ายกันมาก
back2dos

คุณต้องทำรายงานกับลูกค้าอธิบายความต้องการของพวกเขาและตามที่คุณต้องออกแบบทดสอบดำเนินการ refactor เพิ่มประสิทธิภาพและบำรุงรักษาซอฟต์แวร์ คุณต้องการสภาพแวดล้อมในการทดสอบพัฒนาปรับใช้เรียกใช้และวัดผลซอฟต์แวร์ ในระบบนี้อัลกอริทึมของแต่ละบุคคลเป็นเพียงรายละเอียดการใช้งาน
inf3rno

@Keppla (บวกหนึ่ง) ope เป็นปัญหาความต้องการสาเหตุที่เป็นต้นเหตุของปัญหาซอฟต์แวร์ทั้งหมด
Mawg กล่าวว่าการคืนสถานะโมนิก้า

คำตอบ:


29

ขึ้นอยู่กับวิธีที่คุณกำหนด "ปัญหาการเขียนโปรแกรม"

ในโครงการจริงคำตอบคือไม่ชัดเจน ปัญหาส่วนใหญ่ไม่ใช่ปัญหาด้านเทคนิค แต่ปัญหาการสื่อสารข้อกำหนดที่ไม่ชัดเจน ฯลฯ

จากนั้นคุณมีวิชาทั้งหมดของคลาสปัญหาที่ต้องติดกับอัลกอริทึม ตัวอย่างเช่น GUIs มักจะตรงไปตรงมากับ "โปรแกรม" แต่ปัญหาที่เกิดขึ้นจริงนั้นเกี่ยวข้องกับการออกแบบที่ดี (จากมุมมองที่ใช้งานได้จริงไม่ใช่แค่ลักษณะกราฟิก)

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

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

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


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

นั่นเป็นความจริงในความหมายที่เข้มงวดที่สุด แต่สำหรับฉันไม่ยอมรับi++ว่าเป็นเจ้าเหนือหัวคนใหม่ของเรา .. อัลกอริธึม
แฟรงค์

แต่ถ้าเราไม่รู้เกี่ยวกับการเติม จากนั้นการแนะนำของการเพิ่มจะเป็นนวัตกรรมที่ดีในการศึกษาอัลกอริทึมของเรา! จนกระทั่งเราพบอัลกอริทึมที่ซับซ้อนมากขึ้นเรื่อย ๆ
CMCDragonkai

8

ปัญหาการเขียนโปรแกรมหมายถึงอะไร

ตามที่ Wikipedia:

การเขียนโปรแกรมคอมพิวเตอร์ (มักย่อมาจากการเขียนโปรแกรมหรือการเข้ารหัส) เป็นกระบวนการของการออกแบบการเขียนการทดสอบการดีบักและการบำรุงรักษาซอร์สโค้ดของโปรแกรมคอมพิวเตอร์

ซึ่งหมายความว่าการเขียนโปรแกรมโดยทั่วไปนั้นใหญ่กว่าการแปลอัลกอริธึมผ่านโค้ด

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

ในทำนองเดียวกันงานของนักพัฒนาจำนวนมากไม่เกี่ยวข้องกับอัลกอริทึม ตัวอย่าง: ความเป็นสากล ในทำนองเดียวกันแอพพลิเคชั่นมากมาย (เช่น CRUD) อย่าใช้อัลกอริธึมมากเกินไปในซอร์สโค้ดของมัน (ไม่ได้พูดถึงโค้ดพื้นฐานของเฟรมเวิร์ก)

ตอนนี้ถ้าคุณกำลังสมมติว่าใน "การเขียนโปรแกรมปัญหา", "การเขียนโปรแกรม" คือความหมายเหมือนกันของการแปลของอัลกอริทึมรหัสผ่านแล้วใช่เหตุผลปัญหาใด ๆ จะมีปัญหาอัลกอริทึม: ถ้าA × n = B × nA = B


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

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

6

ผมคิดว่าคำตอบคือกึกก้องไม่มี อัลกอริทึมเป็นเพียงการสร้างบล็อคในชุดทักษะที่มีขนาดใหญ่กว่ามาก

ฉันได้รับปริญญาของฉันใน CS มีความเชี่ยวชาญใน AI

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

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

อัลกอริทึมก็มีความสำคัญเช่นกัน แต่เป็นเพียงส่วนหนึ่งของเรื่องราว


5

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

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

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


2

ปัญหาการเขียนโปรแกรมส่วนใหญ่เป็นปัญหาการบริหารระบบจริง

นั่นเป็นคำตอบที่ไม่ย่อท้อ แต่ฉันพบว่านี่เป็นความจริงบ่อยกว่าที่คาดไว้ ฉันไม่ทราบว่ามีกี่ครั้งที่ฉันล้มเหลวเนื่องจาก DNS ถูกกำหนดค่าผิดพลาดบนเครื่องทดสอบกระบวนการเก่ายังคงทำงานอยู่ซึ่งกำลังใช้งาน CPU / หน่วยความจำ / พอร์ตโปรแกรมกำลังทำงานด้วย ID ผู้ใช้ที่ไม่ถูกต้อง การอนุญาตดิสก์ถูกแบ่งพาร์ติชั่นอย่างไม่ถูกต้องและมีพื้นที่เหลือเพียงพอไฟล์ติดตั้งรุ่นที่ไม่ถูกต้อง ฯลฯ

การทำให้อัลกอริทึมถูกต้องมักเป็นเพียงส่วนเล็ก ๆ ของปัญหา ส่วนที่เหลือของปัญหาคือการวางโปรแกรมเพื่อทำงานแก้ปัญหาจริงในโลกแห่งความจริง


"การทำให้อัลกอริทึมถูกต้องมักเป็นเพียงปัญหาเล็ก ๆ เท่านั้น" ปัญหาที่ kaggle.com ไม่เหมาะกับคำอธิบายนั้น
แกนดัล์ฟ

ฉันเห็นด้วยฉันเพิ่งวางพวกมันในหมวดหมู่ "การประปา" การทำงานกับบริการของโปรแกรมเมอร์อื่น ๆ API และบางครั้งเฟรมเวิร์กเป็นเพียงการเชื่อมต่อสิ่งต่าง ๆ ตามที่คนอื่นคิดว่าควรทำงาน
JeffO

2

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

ยกตัวอย่างจากด้านบน

ตัวอย่างเช่น GUIs มักจะตรงไปตรงมากับ "โปรแกรม" แต่ปัญหาที่เกิดขึ้นจริงนั้นเกี่ยวข้องกับการออกแบบที่ดี (จากมุมมองที่ใช้งานได้จริงไม่ใช่แค่ลักษณะกราฟิก)

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

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

แต่วิธีการที่คุณเข้าใกล้การเพิ่มการทดสอบหน่วยสามารถอธิบายได้ด้วยอัลกอริทึมเช่น

  1. ระบุการทดสอบหน่วยใหม่
  2. เขียนการทดสอบหน่วย
  3. ใช้อัลกอริทึมการปรับรูปแบบการทำให้เป็นทุน
  4. ใช้อัลกอริทึมความคิดเห็น

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

ปัญหาที่มีคำตอบใช่ส่วนใหญ่คือผู้คนกำลังคิดถึงอัลกอริธึมในแง่ของ QuickSort, Bubble sort แทนที่จะเป็นชุดของคำสั่งที่ลดคำอธิบายที่คลุมเครือของ verbose ลงในชุดของตรรกะ / กฎที่กำหนดไว้อย่างชัดเจน

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