การเขียนโปรแกรมหรือวิทยาการคอมพิวเตอร์โดยทั่วไปเกี่ยวกับอัลกอริทึมหรือไม่


40

ในฐานะนักเรียนระดับบัณฑิตศึกษาฉันพบว่าเป็นเรื่องปกติมากขึ้นสำหรับ บริษัท ที่มีชื่อเสียง (เช่น Google, Facebook, Microsoft, ... ) เพื่อวางคำถามอัลกอริทึมในการทดสอบและการสัมภาษณ์ สองสามสตาร์ทอัพที่ฉันสมัครเพื่อถามเกี่ยวกับอัลกอริทึม ฉันสงสัยว่าความคล่องแคล่วของอัลกอริทึมเป็นสิ่งสำคัญที่สุดสำหรับนักพัฒนาซอฟต์แวร์ใน บริษัท เหล่านั้นหรือไม่?

หากคำตอบคือใช่วิธีที่ดีที่สุดในการเรียนรู้และฝึกฝนเกี่ยวกับอัลกอริธึมคืออะไร? ฉันดูเหมือนจะไม่สนใจที่จะแก้ไขปัญหาที่ซับซ้อนเกินไปที่พบในตำราเรียนหรือเว็บไซต์ส่วนใหญ่ แม้ว่าจะเข้าใจอัลกอริธึมพื้นฐาน (เช่น quicksort, bubbleort, ... ) ได้อย่างง่ายดาย แต่ฉันพบว่ามันยากที่จะจำและนำกลับมาใช้ใหม่ได้ในภายหลัง

ขอบคุณ

P / S: ถ้าคุณถามฉันในสิ่งที่ฉันชอบมันกำลังสร้างโปรแกรมที่ดีในการแก้ปัญหาของผู้ใช้อย่างสร้างสรรค์ ฉันคิดว่าไม่จำเป็นต้องหมายความว่าซอฟต์แวร์จะต้องมีความซับซ้อนมาก


26
ความคิดใดที่ Google มีความซับซ้อนในการอนุญาตให้คุณค้นหาทั้งเว็บด้วยกล่องข้อความและปุ่ม?
JeffO

21
@JeffO ฉันไม่ได้ใช้ปุ่มอีกต่อไป ;-)
maple_shaft

1
หาก Google ทำให้ง่ายขึ้นเว็บไซต์การค้นหาอื่น ๆ ทั้งหมดไม่จำเป็นต้องใช้รหัสใด ๆ เลย
JeffO

ฉันคิดว่าคำถามจะเกี่ยวกับการทำงานของคอมพิวเตอร์เช่นการทำงานของ CPU, RAM ทำงานอย่างไร, wifi ทำงานอย่างไร ฯลฯ คำถามเหล่านี้ค่อนข้างน่าสนใจที่ยังคงมีการวิจัยค่อนข้างมาก ฉันยังพบว่าฮาร์ดแวร์ยอดเยี่ยมกว่าการเขียนโปรแกรม geeks ทั้งหมดใน java หรือ php
jokoon

2
มันไม่ได้เกี่ยวกับอัลกอริธึม แต่จริงๆแล้วมันอยู่ที่แกนกลางของ CS แต่มีจำนวนมากในการเขียนโปรแกรมมากกว่าแค่อัลกอริธึมและตรรกะ (การบำรุงรักษาโค้ดตัวอย่างเช่นไม่จำเป็นต้องมีความรู้เกี่ยวกับอัลกอริธึมเท่านั้น)
haylem

คำตอบ:


44

อัลกอริทึมชัดเจน

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

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

อัลกอริทึมเป็นตัวกรองที่มีประสิทธิภาพ

ปัญหาในปัจจุบันของอุตสาหกรรม (และการศึกษา) คือคุณภาพบัณฑิตที่ไม่ดีโดยเฉลี่ย นี่เป็นตัวอย่างของการทดสอบFizzBuzzซึ่งก็คือ:

เขียนโปรแกรมที่จะผ่านตัวเลขตั้งแต่ 1 ถึง 100 และจะพิมพ์ "fizz" ถ้าจำนวนหารด้วย 3, "buzz" ถ้าหารด้วย 5 และจำนวนตัวถ้าหารด้วยไม่ได้

เห็นได้ชัดว่าผู้สำเร็จการศึกษา Comp Compi ส่วนใหญ่ทั้งหมดไม่สามารถแก้ปัญหานี้ได้ โปรดทราบว่านี่เป็นคำถามเกี่ยวกับอัลกอริทึม แต่แน่นอนว่าเป็นเรื่องง่ายที่น่าอับอาย เมื่อได้รับสิ่งนี้การรับคนที่สามารถแก้ไขปัญหาที่เกิดขึ้นใน Google Code Jam หรือ Project Euler คุณได้เพลิดเพลินไปกับcrème-de-la-crèmeแล้ว

อัลกอริทึมเป็นส่วนเล็ก ๆ ของการพัฒนาซอฟต์แวร์

ความจริงก็คือทันทีที่คุณทำงานในอุตสาหกรรมคุณจะไม่ใช้ทักษะอัลกอริทึมมากกว่า 1% ของเวลา

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

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

อัลกอริทึมมีความสำคัญ

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

อะไรคือสิ่งที่สำคัญจริงๆคือการได้รับความรู้สึกสำหรับคอมพิวเตอร์ที่ซับซ้อนและวิธีการที่จะให้มันต่ำที่สุดเท่าที่ฉันยังอธิบายในการตอบสนองต่อคำถามที่คล้ายกัน หรือจะชำนาญในสิ่งต่าง ๆ ที่สิ่งนี้ไม่สำคัญเช่นการพัฒนา GUI แต่หลังจากนั้นเกือบทุกคนเกลียดมัน ... ด้วยเหตุผล!


5
+1 สำหรับคำตอบที่ครอบคลุมและชาญฉลาดมาก นอกจากนี้มันเป็นเรื่องน่าเศร้าที่ประสิทธิภาพของตัวกรอง FizzBuzz ไม่มีข้อแก้ตัวใด ๆ ที่ไม่สามารถทำได้
Adam Crossland

4
ฉันคิดว่าคุณควรจะพิมพ์fizzbuzzถ้าจำนวนนั้นหารด้วยและทั้งคู่ก็เลื่อนไปเพราะคุณจำเป็นต้องสั่งโมดูโลตรวจสอบอย่างระมัดระวัง
Matthieu M.

1
1% อาจสูงเกินไปเล็กน้อย
ป่าน

1
@MatthieuM: การพิมพ์ทั้งสองนั้นมีอยู่ในความต้องการของประโยค พลาดไปหมายความว่าคุณไม่ได้ตรวจสอบข้อกำหนดอย่างละเอียด ตอนนี้สิ่งที่ฉันคิดว่าน่าสนใจก็คือมันไม่ได้บอกว่าคุณต้องพิมพ์มันตามลำดับใด ๆ หรือแม้กระทั่งในลำดับเดียวกัน ...
jmoreno

1
@ back2dos: ใช่ แต่ทำมันในเสียงเพื่อสุ่มเช่นความสนุกสนานมากขึ้น ... ทราบว่าต้องการตามที่กำหนดในคำตอบนี้ไม่ได้พูดถึงเส้นเพียงแค่พิมพ์ หากคุณได้รับการทดสอบ FizzBuzz มันอาจคุ้มค่าที่จะชี้ให้เห็นว่ามีสมมติฐานจำนวนมากที่ไม่ได้ระบุไว้ในนั้น (จากนั้นอีกครั้ง
jmoreno

30

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

การเขียนโปรแกรมเป็นงานเกี่ยวกับ:

  1. การสื่อสาร:

    • ซอร์สโค้ดของคุณเป็นวิธีการสื่อสารความคิดของคุณไปยังเพื่อนของคุณ หากไม่มีใครสามารถอ่าน / ทำความเข้าใจโค้ดของคุณได้มันก็ไร้ค่า

    • นักพัฒนาคนเดียวที่ไม่ได้พูดคุยกับผู้พัฒนารายอื่นอาจเริ่มทำผิดพลาดในโค้ดและเชื่อว่าวิธีการของเขานั้นเป็นแนวทางเดียวที่ยอมรับได้

    • คุณต้องรู้วิธีการสื่อสารกับผู้มีส่วนได้ส่วนเสียแผนกควบคุมคุณภาพผู้ใช้นักออกแบบภาพ DBAs ฯลฯ

    • ในฐานะนักพัฒนาที่มีประสบการณ์คุณต้องสอนเพื่อนร่วมงานที่มีประสบการณ์น้อยซึ่งต้องการพัฒนาทักษะของพวกเขา

  2. มีความรู้เกี่ยวกับเครื่องมือที่เหมาะสม: การควบคุมเวอร์ชัน, ระบบติดตามบั๊ก, IDEs, ภาษาใดที่เหมาะกับงานเฉพาะและทำไม, วิธีใช้การวิเคราะห์รหัส, ฯลฯ

  3. ความรู้และวัฒนธรรมในวงกว้าง: ภาษาทำงานคืออะไร? คอมพิวเตอร์ตีความรหัสอย่างไร ทำไม LOC ถึงเป็นตัววัดที่ไร้ความหมาย? เป็นต้น

  4. มีความรู้ด้านภาษาอย่างลึกซึ้ง

  5. อัลกอริทึม

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


12
-1: "แอปพลิเคชัน CRUD" เป็นอัลกอริทึม มันเรียบง่าย (โดยทั่วไป) เรียบง่าย ไม่มี "ความหมายอันสูงส่ง"
S.Lott

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

5
มันเป็นเรื่องที่น่าประหลาดใจที่ตลาดดีแค่ไหนในการทำความสะอาดแอพพลิเคชั่น CRUDdy ซึ่งทีมวิศวกรไม่สนใจ (หรือไม่เคยเรียนรู้) พื้นฐานของอัลกอริทึม
JasonTrue

2
@ S.Lott: "แอปพลิเคชัน CRUD เป็นอัลกอริธึม" ซึ่งคล้ายคลึงกับ "I am America" ;)
Jim G.

1
@JimG: ในขณะที่ Steven Colbert พูดว่า "ฉันเป็นคนอเมริกาและคุณก็เป็นเช่นนั้นได้" แอปพลิเคชัน CRUD ประกอบด้วย, รวม,, มีการใช้งาน, รับรู้, รวบรวม, สะท้อนขั้นตอนวิธี คุณบ่นเพียงโดยไม่แนะนำคำบุพบทเฉพาะ สิ่งใดที่ทำให้คุณมีความสุขมากขึ้น?
S.Lott

16

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

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

สำหรับวิธีการปฏิบัติในการออกแบบขั้นตอนวิธีสตีฟ Yegge แนะนำ Skiena ของคู่มือการใช้อัลกอริทึมการออกแบบของเขาในคู่มือที่ดีในการสัมภาษณ์เป็นโปรแกรมเมอร์


4
+1: ภาษาการเขียนโปรแกรมเฟรมเวิร์กระบบปฏิบัติการบรรณาธิการชุดเครื่องมือพวกเขาทั้งหมดมาและไป แต่การรู้วิธีแก้ปัญหาอย่างมีประสิทธิภาพนั้นมีทุกอย่างที่เกี่ยวข้องกับการรู้พื้นฐานของโครงสร้างข้อมูลและอัลกอริธึม สิ่งเหล่านี้อยู่กับเราเสมอ
Adam Crossland

"สำหรับวิธีฝึกการออกแบบอัลกอริทึม Steve Yegge ขอแนะนำคู่มือการออกแบบอัลกอริทึมของ Skiena ในคู่มือที่ยอดเยี่ยมของเขาในการสัมภาษณ์ในฐานะโปรแกรมเมอร์" ขออภัย แต่อาจไม่สามารถใช้ได้กับผู้ที่ถามคำถามนี้เนื่องจากเขาเป็นนักเรียนที่จบการศึกษา Google / MS ได้ย้ายมาจาก Skiena (สำหรับผู้สำเร็จการศึกษา) เพื่อถามคำถามที่ปรากฏในการแข่งขันการเขียนโปรแกรมระดับวิทยาลัยระหว่างประเทศ (สิ่งนี้ฉันรู้แน่นอนจากประสบการณ์พอสมควร) หนังสือของ Skiena ยังคงใช้ - แต่ส่วนใหญ่สำหรับผู้สมัครระดับปริญญาตรี
user396089

สำหรับคำถามที่ปรากฏในการแข่งขันการเขียนโปรแกรม - คุณค่อนข้างถูก hosed ถ้าคุณไม่เคยเห็นคำถามมาก่อน (เว้นแต่ว่า IQ ของคุณจะอยู่ห่างจาก 3 SD ปกติ)
396089

11

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

  • นักพัฒนาที่ไม่สามารถเรียนรู้และปรับตัวเข้ากับโดเมนใหม่ได้อย่างรวดเร็ว

  • นักพัฒนาที่ไม่สามารถโต้ตอบกับลูกค้าหรือผู้มีส่วนได้ส่วนเสียในทางสังคมได้อย่างมีความหมาย

  • นักพัฒนาซอฟต์แวร์ที่ไม่สามารถคาดเดาได้ในครั้งที่สองและตั้งคำถามไม่ถูกต้อง

  • นักพัฒนาซอฟต์แวร์ที่ไม่เข้าใจวิธีการทดสอบรหัสและคุณสมบัติอย่างละเอียด

  • นักพัฒนาที่ไม่สามารถคาดการณ์ที่มีความหมายได้ทันเวลา

  • นักพัฒนาที่ไม่สามารถสร้างเอกสารที่ชัดเจนและรัดกุม

  • นักพัฒนาที่ไม่สามารถเริ่มต้นเองหรือรับผิดชอบสถานการณ์ได้

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

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


+1 บริษัท ที่มีลักษณะเหมือนปกติและไม่ใช่ของ Google ต้องการคนที่มีทักษะทางธุรกิจที่ดีและส่วนใหญ่ในการทำความเข้าใจวิธีคิดค้น / ใช้ / จัดการ / แก้ไขกระบวนการ ไม่ใช่ความผิดพลาดที่ บริษัท ที่มีลักษณะคล้าย Google ไม่ได้ออกมาเคลื่อนไหวแบบ Agile เพราะวิทยาศาสตร์คอมพิวเตอร์ไม่ได้เกี่ยวกับการแก้ปัญหาทางธุรกิจ
S.Robins

10

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

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

"ฉันดูเหมือนจะไม่สนใจที่จะแก้ไขปัญหาที่ซับซ้อนเกินไปที่พบในตำราเรียนหรือเว็บไซต์ส่วนใหญ่"

"ฉันพบว่ามันยากที่จะจำอย่างมากและนำมาใช้ใหม่ในภายหลัง"

บังคับตัวเองให้ทำจนครบ คุณจะขอบคุณตัวเองในภายหลัง แม้ว่าคุณจะไม่จำรายละเอียดทั้งหมด (แม้ว่าจะมีการฝึกฝนมากพอที่คุณจะทำได้) เพื่อที่จะพูดว่า "ฉันจำได้ว่าการแก้ปัญหาบางอย่างที่คล้ายกันโดยใช้อัลกอริทึม X หรือโครงสร้างข้อมูล Y" จะช่วยคุณได้อย่างมาก แม้ว่ามันจะทำให้คุณต้องค้นหารายละเอียดและรีเฟรชหน่วยความจำของคุณ


+1 สำหรับโครงสร้างข้อมูล พวกเขาเป็นอีกครึ่งหนึ่งของเหรียญอัลกอริทึม
Spencer Rathbun

9

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

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


1
+1 คำตอบที่สมบูรณ์แบบ! ง่ายต่อการทดสอบความรู้อัลกอริทึม
maple_shaft

"อัลกอริทึมของคุณ" - ฉันสอนตัวเอง มีแหล่งที่มาหรือรายการที่ระบุว่าอัลกอริทึมทั่วไปเหล่านี้คืออะไรที่โปรแกรมเมอร์ทุกคนควรรู้ ฉันต้องการอ่านมัน ขอบคุณ!
Ominus

2
@Ominus แม้ว่าจะไม่มีความเห็นทั่วไปเกี่ยวกับ "รายการสุภาพบุรุษ" ของอัลกอริทึม แต่ในกรณีส่วนใหญ่จะรวมถึงการค้นหาการเรียงลำดับการสำรวจโครงสร้างข้อมูลที่ขาดความต่อเนื่องของอวกาศ (รายการที่เชื่อมโยงต้นไม้ไบนารีเป็นต้น) และพื้นฐาน การประยุกต์ใช้การเรียกซ้ำ (แฟกทอเรียลแบบเรียกซ้ำ, ลำดับฟีโบนักชี ฯลฯ )
dasblinkenlight

@Ominus - ฉันเรียนรู้ด้วยตนเองด้วย แต่ฉันคิดว่า "ความรู้เบื้องต้นเกี่ยวกับอัลกอริทึม" - CLRS เป็นวิธีที่ดีในการทำความคุ้นเคยกับฟิลด์ หนังสือของ Skiena "คู่มือการออกแบบอัลกอริทึม" ก็ดีเช่นกัน
ท็อด

5

ใช่การเขียนโปรแกรมส่วนใหญ่เกี่ยวกับอัลกอริทึม

แต่อาจไม่ใช่ในแง่ที่คุณกำลังคิด

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

ชุดของกฎที่กำหนดลำดับของการดำเนินการอย่างแม่นยำ

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

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


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

4

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

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

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


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

1

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

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


1

โปรแกรมเมอร์เท่านั้นที่ทำงานให้กับ บริษัท เหล่านั้นสามารถตอบคำถามคุณได้ ประเภทของอัลกอริทึมที่เกี่ยวข้องกับการพูดว่า "รู้เบื้องต้นเกี่ยวกับอัลกอริทึม" อาจมีส่วนร่วมใน 0.01% ของอายุการเขียนโปรแกรมของฉันในช่วง 25 ปีที่ผ่านมา เมื่อฉันต้องการโครงสร้างข้อมูลหรือเรียงลำดับโดยปกติแล้วไลบรารีหรือกรอบงานที่ให้มาจะมีสิ่งที่ฉันต้องการ เมื่อฉันต้องการ FFT ที่เร็วเป็นพิเศษฉันค้นหาสิ่งที่ชอบ Intel Math lib แทนที่จะเขียนด้วยตัวเอง อย่างไรก็ตามฉันสามารถทำสิ่งที่พวกเขาทำกับ Google ได้แตกต่างจากที่ฉันทำในอาชีพของฉัน หนังสือของ Skiena "คู่มือการออกแบบอัลกอริทึม" เปิดหูเปิดตาเพราะเรื่องราวของสงครามที่เขาบอก คุณสามารถบอกได้ว่าเขาใช้อัลกอริทึมในงานของเขามากมาย

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

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

หมายเลข 3 เป็นทักษะการเขียนโปรแกรมที่ยากที่สุดในการเป็นผู้เชี่ยวชาญ มันต้องใช้ความคิดที่จะใส่ลงในสถาปัตยกรรมการออกแบบและการเข้ารหัส มันต้องมีการปรับโครงสร้างการเรียนรู้ มันต้องมีความเข้าใจในหลักการของ SOLID / DRY ถ้าฉันต้องจ้างโปรแกรมเมอร์ที่อ่านอินโทรอัลกอริทึมและอุทิศตัวเองเพื่อการเรียนรู้หรือหนึ่งที่อ่าน The Pragmatic Programmer และอุทิศตนเพื่อเป็นหนึ่งฉันจะจ้างหลังทุกครั้ง (ไม่ใช่ว่าพวกเขาจะต้องไม่เกิดร่วมกัน)


1

ใช่.

วิทยาการคอมพิวเตอร์ส่วนใหญ่เป็นอัลกอริทึม (โดยร้อยละ)

เลขที่

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

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

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

อาจดูเหมือนความหมาย แต่จากความเข้าใจของฉันทั้งสองมีความแตกต่างอย่างน่าทึ่งทั้งในการปฏิบัติและทฤษฎี


1

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


1

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

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

ออโต

การก่อสร้าง Powerset อัลกอริทึมในการแปลงออโตเมติก nondeterministic เป็นออโตเมติกที่กำหนด อัลกอริธึม Todd-Coxeter ขั้นตอนสำหรับการสร้าง cosets

ปัญญาประดิษฐ์

อัลฟาเบต้า อัลฟ่าสูงสุดรวมเบต้าขั้นต่ำ ใช้กันอย่างแพร่หลายในเกมกระดาน Ant-อัลกอริทึม การเพิ่มประสิทธิภาพฝูงมดคือชุดของอัลกอริทึมที่ได้รับแรงบันดาลใจจากพฤติกรรมของมดในการแก้ปัญหาหาเส้นทางที่ดีที่สุดระหว่างสองตำแหน่ง DE (วิวัฒนาการเชิงอนุพันธ์) แก้ปัญหาพหุนาม Chebyshev การรับรู้แบบกึ่งมีอำนาจภายใต้ประโยค Sarcastic ในบทวิจารณ์ผลิตภัณฑ์ออนไลน์ Algortithm ที่รู้จัก sacarsms หรือประชดใน tweet หรือเอกสารออนไลน์ อัลกอริทึมดังกล่าวจะจำเป็นสำหรับการเขียนโปรแกรมหุ่นยนต์ฮิวแมนนอยด์เช่นกัน

วิสัยทัศน์คอมพิวเตอร์

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

อัลกอริทึมทางพันธุกรรม

พวกเขาใช้สามผู้ประกอบการ การเลือก (เลือกโซลูชัน) ทำซ้ำ (ใช้โซลูชันที่เลือกไว้เพื่อสร้างรายการอื่น) เปลี่ยน (แทนที่โซลูชันถ้าดีกว่า)

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

โครงข่ายประสาท

ฮ็อพสุทธิ เครือข่ายประสาทเทียมที่เกิดขึ้นอีกซึ่งทำหน้าที่เป็นระบบหน่วยความจำที่ระบุตำแหน่งเนื้อหาด้วยหน่วยขีด จำกัด เลขฐานสอง พวกเขามาบรรจบกันเป็นสถานะที่มั่นคง แพร่กระจายย้อนกลับ เทคนิคการเรียนรู้แบบมีผู้สอนใช้สำหรับการฝึกอบรมเครือข่ายประสาทเทียม แผนที่การจัดระเบียบตนเอง (แผนที่ Kohonen) โครงข่ายประสาทเทียมที่ได้รับการฝึกอบรมโดยใช้การเรียนรู้ที่ไม่ได้รับการฝึกอบรมเพื่อสร้างการเป็นตัวแทนของตัวอย่างการฝึกอบรมในระดับต่ำ (2D, 3D) ดีสำหรับการแสดงข้อมูลมิติสูง

ชีวสารสนเทศศาสตร์

Needleman-Wunsch ดำเนินการจัดตำแหน่งทั่วโลกในสองลำดับสำหรับโปรตีนหรือลำดับนิวคลีโอไทด์ สมิ ธ ฝีพาย การเปลี่ยนแปลงของ Needleman-Wunsch

การอัด

อัลกอริทึมการบีบอัดแบบไม่สูญเสียข้อมูล

Burrows-Wheeler transform การประมวลผลล่วงหน้ามีประโยชน์สำหรับการปรับปรุงการบีบอัดแบบไม่สูญเสียข้อมูล ยุบ การบีบอัดข้อมูลที่ใช้โดย ZIP การเข้ารหัสเดลต้า ช่วยในการบีบอัดข้อมูลที่ข้อมูลตามลำดับเกิดขึ้นบ่อยครั้ง การเข้ารหัสที่เพิ่มขึ้น การเข้ารหัสเดลต้านำไปใช้กับลำดับของสตริง LZW (Lempel-Ziv-เวลช์) ตัวตายตัวแทนของ LZ78 สร้างตารางการแปลจากข้อมูลที่จะบีบอัด ถูกใช้โดยรูปแบบกราฟิก GIF LZ77 และ 78พื้นฐานของรูปแบบ LZ เพิ่มเติม (LZW, LZSS, ... ) พวกเขาเป็นทั้งผู้ติดตั้งพจนานุกรม LZMA ย่อมาจาก Lempel-Ziv-Markov chain-Algorithm LZO อัลกอริธึมการบีบอัดข้อมูลที่เน้นความเร็ว PPM(การทำนายโดยการจับคู่บางส่วน) เทคนิคการบีบอัดข้อมูลเชิงสถิติแบบปรับตามบริบทและการทำนาย การเข้ารหัส Shannon-Fano สร้างรหัสคำนำหน้าตามชุดของสัญลักษณ์และความน่าจะเป็น ไบนารีที่ถูกตัดทอน การเข้ารหัสเอนโทรปีโดยปกติจะใช้สำหรับการแจกแจงความน่าจะเป็นแบบเดียวกันที่มีตัวอักษร จำกัด ปรับปรุงการเข้ารหัสแบบไบนารี การเข้ารหัสความยาว การบีบอัดหลักที่แทนที่ลำดับของรหัสเดียวกันด้วยจำนวนที่เกิดขึ้น sequitur การอนุมานไวยากรณ์ที่เพิ่มขึ้นบนสตริง EZW (Zerotree Wavelet ในตัว) การเข้ารหัสแบบก้าวหน้าเพื่อบีบอัดภาพเป็นบิตสตรีมด้วยความแม่นยำที่เพิ่มขึ้น อาจเป็นการบีบอัดแบบ lossy ด้วยผลลัพธ์ที่ดีกว่า

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

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

อัลกอริทึมการบีบอัดแบบสูญเสีย

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

การอ่านรหัส

คีย์ลับ (การเข้ารหัสแบบสมมาตร)

ใช้รหัสลับ (หรือคู่ของคีย์ที่เกี่ยวข้องโดยตรง) สำหรับการถอดรหัสและการเข้ารหัส

มาตรฐานการเข้ารหัสขั้นสูง (AES)หรือที่เรียกว่า Rijndael ปักเป้า. ออกแบบโดย Schneier เป็นอัลกอริธึมที่ใช้งานทั่วไปโดยมีวัตถุประสงค์เพื่อทดแทนอายุที่มาก มาตรฐานการเข้ารหัสข้อมูล (DES)เดิมคืออัลกอริธึม DE IDEA (นานาชาติการเข้ารหัสข้อมูลขั้นตอนวิธีการ) IPES เดิม (PES ที่ปรับปรุงแล้ว), การแทนที่ DES อื่น ถูกใช้โดย PGP (Pretty Good Privacy) ทำการแปลงข้อมูลแยกเป็นบล็อกโดยใช้คีย์ RC4 หรือ ARC4 สตรีมตัวเลขที่ใช้กันอย่างแพร่หลายในโปรโตคอลเช่น SSL สำหรับการรับส่งข้อมูลอินเทอร์เน็ตและ WEP สำหรับเครือข่ายไร้สาย อัลกอริทึมการเข้ารหัสเล็ก ๆ ง่ายต่อการใช้อัลกอริทึมการเข้ารหัสบล็อกโดยใช้สูตรบางอย่าง PES (มาตรฐานการเข้ารหัสที่เสนอ) ชื่อเก่าสำหรับ IDEA

กุญแจสาธารณะ (การเข้ารหัสแบบอสมมาตร)

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

DSA (อัลกอริธึมลายเซ็นดิจิทัล) สร้างปุ่มที่มีหมายเลขเฉพาะและหมายเลขสุ่ม ถูกใช้งานโดยหน่วยงานของสหรัฐอเมริกาและในขณะนี้โดเมนสาธารณะ ElGamal อ้างอิงจาก Diffie-Hellman ใช้โดยซอฟต์แวร์ GNU Privacy Guard, PGP และระบบเข้ารหัสอื่น ๆ RSA (Rivest, Shamir, Adleman) ใช้กันอย่างแพร่หลายในโปรโตคอลการค้าอิเล็กทรอนิกส์ ใช้ตัวเลขเฉพาะ การแลกเปลี่ยนคีย์ Diffie-Hellman (Merkle) (หรือการแลกเปลี่ยนคีย์แบบเลขชี้กำลัง) วิธีการและอัลกอริทึมในการแบ่งปันความลับผ่านช่องทางการสื่อสารที่ไม่มีการป้องกัน ใช้โดย RSA NTRUEncrypt ใช้ประโยชน์จากวงของพหุนามที่มีการคูณด้วยการโน้มน้าวใจ

ฟังก์ชั่นสรุปข้อความ

ข่าวสารย่อยเป็นรหัสที่เกิดจากการเข้ารหัสของสตริงหรือข้อมูลที่มีความยาวใด ๆ ที่ประมวลผลโดยฟังก์ชั่นแฮช

MD5 ใช้สำหรับตรวจสอบ ISO อิมเมจของซีดีหรือดีวีดี RIPEMD (สรุปข้อความการประเมินผลเบื้องต้นของ RACE Integrity) ตามหลักการของ MD4 และคล้ายกับ SHA-1 SHA-1 (อัลกอริทึมแฮชที่ปลอดภัย 1) ใช้บ่อยที่สุดของชุด SHA ของฟังก์ชันแฮชการเข้ารหัสที่เกี่ยวข้อง ได้รับการออกแบบโดยหน่วยงาน NSA HMAC การพิสูจน์ตัวตนข้อความแบบคีย์ - แฮช เสือ (TTH) มักใช้ในการแฮชต้นไม้ไทเกอร์

การเข้ารหัสลับโดยใช้ตัวเลขสุ่มหลอก ดู เครื่องกำเนิดจำนวนสุ่ม

เทคนิคการเข้ารหัส

การแบ่งปันลับ, การแยกลับ, การแยกคีย์, อัลกอริทึม M of N

แผนการแบ่งปันความลับของ Shamir นี่คือสูตรขึ้นอยู่กับการแก้ไขพหุนาม แผนการแบ่งปันความลับของ Blakley เป็นรูปทรงเรขาคณิตในธรรมชาติความลับคือจุดหนึ่งในพื้นที่มิติ m

เทคนิคและการถอดรหัสอื่น ๆ

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

เรขาคณิต

การห่อของขวัญ. การกำหนดฮัลล์นูนของชุดของคะแนน ระยะทาง Gilbert-Johnson-Keerthi การกำหนดระยะทางที่เล็กที่สุดระหว่างสองรูปร่างนูน สแกนเกรแฮม การกำหนดฮัลล์นูนของชุดของจุดในเครื่องบิน การตัดกันของส่วนของเส้น การค้นหาว่าเส้นตัดกันด้วยอัลกอรึทึมการกวาดหรือไม่ จุดเป็นรูปหลายเหลี่ยม ทดสอบว่าจุดที่กำหนดอยู่ภายในจุดที่กำหนดหรือไม่ แยกเรย์ / เครื่องบิน * จุดตัด / เส้นสามเหลี่ยม * กรณีเฉพาะของการแยกเรย์ / เครื่องบิน รูปหลายเหลี่ยมของพื้นผิวโดยนัย ประมาณพื้นผิวโดยนัยด้วยการแสดงรูปหลายเหลี่ยม triangulationวิธีการประเมินระยะทางจากจุดหนึ่งไปยังอีกมุมหนึ่งซึ่งเป็นที่ทราบระยะทาง

กราฟ เทคโนโลยีติดตามพื้นผิว 3 มิติ กระบวนการเพิ่มรูปภาพบนผนังในวิดีโอขณะที่คำนึงถึงพื้นผิวที่ซ่อนอยู่ ยามฟอร์ด คำนวณเส้นทางที่สั้นที่สุดในกราฟถ่วงน้ำหนัก (ซึ่งน้ำหนักของขอบบางส่วนอาจเป็นค่าลบ) อัลกอริทึมของ Dijkstra คำนวณเส้นทางที่สั้นที่สุดในกราฟด้วยน้ำหนักที่ไม่เป็นลบ วิธีการก่อกวน อัลกอริทึมที่คำนวณเส้นทางที่สั้นที่สุดในเครื่องในกราฟ ฟลอยด์-Warshall แก้ปัญหาเส้นทางที่สั้นที่สุดของคู่ทั้งหมดในกราฟกำกับน้ำหนัก การค้นหาวัฏจักรของฟลอยด์ ค้นหารอบในการวนซ้ำ จอห์นสัน อัลกอริทึมเส้นทางที่สั้นที่สุดของคู่ทั้งหมดในกราฟกำกับน้ำหนักเบาบาง Kruskalค้นหาแผนผังการขยายขั้นต่ำสำหรับกราฟ ของ Prim ค้นหาแผนผังการขยายขั้นต่ำสำหรับกราฟ เรียกอีกอย่างว่า DJP, Jarníkหรืออัลกอริทึม Prim – Jarník * Boruvka. * ค้นหาแผนผังการขยายขั้นต่ำสำหรับกราฟ ฟอร์ด Fulkerson คำนวณการไหลสูงสุดในกราฟ เอ็ดมันด์-คาร์พ การใช้งาน Ford-Fulkerson Nonblocking Switch Spanning ที่น้อยที่สุด สำหรับการแลกเปลี่ยนทางโทรศัพท์ ไม้ชาร์ป ค้นหาแผนผังการขยายขั้นต่ำสำหรับกราฟ ตามฤดูใบไม้ผลิ อัลกอริทึมสำหรับการวาดกราฟ ฮังการี อัลกอริทึมสำหรับการค้นหาการจับคู่ที่สมบูรณ์แบบ อัลกอริทึมการระบายสี อัลกอริทึมการระบายสีกราฟ เพื่อนบ้านที่ใกล้ที่สุดค้นหาเพื่อนบ้านที่ใกล้ที่สุด การจัดเรียงโทโพโลยี จัดเรียงกราฟ acyclic โดยตรงในลักษณะที่แต่ละโหนดมาก่อนโหนดทั้งหมดที่มีขอบ (ตามทิศทาง) ขั้นตอนวิธีทั่วไปน้อยที่สุดของ Tarjan แบบออฟไลน์ คำนวณบรรพบุรุษที่ต่ำที่สุดสำหรับคู่ของโหนดในต้นไม้

กราฟิก

อัลกอริธึมของ Bresenham ใช้ตัวแปรการตัดสินใจเพื่อแปลงเป็นเส้นตรงระหว่าง 2 คะแนนที่ระบุ ทิวทัศน์วาดทิวทัศน์ 3 มิติ * อัลกอริทึมของเส้น DDA * ใช้คณิตศาสตร์เลขทศนิยมเพื่อพล็อตเส้นตรงระหว่าง 2 จุดที่ระบุ เติมน้ำท่วม เติมภูมิภาคที่เชื่อมต่อด้วยสี กู้ภาพ คืนค่ารูปภาพปรับปรุงภาพ อัลกอริทึมสายของ Xiaolin Wu การลดรอยหยักของเส้น อัลกอริธึมของ Painter ตรวจจับส่วนที่มองเห็นได้ของทิวทัศน์ 3 มิติ การติดตามเรย์ การแสดงภาพที่สมจริง พงษ์ร่มเงา รูปแบบการส่องสว่างและวิธีการแก้ไขในคอมพิวเตอร์กราฟิก 3D Gouraud shadingจำลองเอฟเฟกต์แสงและสีที่แตกต่างกันบนพื้นผิวของวัตถุ 3 มิติ การแสดงผล Scanline สร้างภาพโดยการเคลื่อนย้ายเส้นจำนวนจินตภาพ การให้แสงสว่างระดับโลก พิจารณาการให้แสงสว่างโดยตรงและการสะท้อนกลับจากวัตถุอื่น การแก้ไข การสร้างจุดข้อมูลใหม่เช่นดิจิตอลซูม Resynthesizer ลบวัตถุบนภาพถ่ายและสร้างพื้นหลังที่ใช้โดย Photoshop และ The Gimp บทช่วยสอน Resynthesizer อัลกอริธึมความลาดชัน มันคือการดำเนินการตามสูตรของการลาดชันสำหรับการวาดเส้น การแก้ไขเส้นโค้ง ลดข้อผิดพลาดกับปรากฏการณ์ของ Runge เทคโนโลยี 3D Surface Tracker การเพิ่มรูปภาพหรือวิดีโอบนผนังในวิดีโอ, พื้นผิวที่ซ่อนอยู่ถูกนำมาพิจารณา

รายการอาร์เรย์และต้นไม้

ค้นหา

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

การเรียงลำดับ

การจัดเรียงต้นไม้แบบไบนารี เรียงลำดับของต้นไม้แบบไบนารีเพิ่มขึ้นคล้ายกับการเรียงลำดับการแทรก Bogosort การ์ดสุ่มแบบสุ่มที่ไม่มีประสิทธิภาพ เรียงลำดับฟอง สำหรับดัชนีแต่ละคู่ให้สลับรายการหากไม่เรียบร้อย ถังเรียง แยกรายการในที่เก็บและจัดเรียงแยก ข้อมูลทั่วไปเรียงลำดับช่องสำหรับนกพิราบ การจัดเรียงค็อกเทล (หรือฟองสองทิศทาง, เครื่องปั่น, ระลอก, รถรับส่ง, การจัดเรียงชั่วโมงแห่งความสุข) การเปลี่ยนแปลงของการเรียงลำดับฟองที่เรียงลำดับในทั้งสองทิศทางแต่ละรายการผ่านไปในรายการ เรียงลำดับหวี การแปรผันที่มีประสิทธิภาพของการเรียงลำดับฟองที่กำจัด "เต่า" ซึ่งเป็นค่าเล็ก ๆ ใกล้กับจุดสิ้นสุดของรายการและใช้ประโยชน์จากช่องว่างค่าสิบสอง การเรียงลำดับการนับมันใช้ช่วงของตัวเลขในรายการ A เพื่อสร้างอาร์เรย์ B ของความยาวนี้ ดัชนีใน B ใช้เพื่อนับจำนวนองค์ประกอบใน A ที่มีค่าน้อยกว่า i จัดเรียง Gnome คล้ายกับการเรียงลำดับการแทรกยกเว้นว่าการย้ายองค์ประกอบไปยังตำแหน่งที่เหมาะสมสามารถทำได้โดยชุดของการแลกเปลี่ยนเช่นในการจัดเรียงฟอง heapsort แปลงรายการเป็นฮีปให้ลบองค์ประกอบที่ใหญ่ที่สุดออกจากฮีปและเพิ่มเข้าไปที่ท้ายรายการ เรียงลำดับการแทรก กำหนดตำแหน่งที่รายการปัจจุบันอยู่ในรายการของเรียงลำดับและแทรกไว้ที่นั่น Introsort หรือจัดเรียงครุ่นคิด มันเริ่มต้นใน quicksort และเปลี่ยนเป็น heapsort ในระดับการเรียกซ้ำ เรียงลำดับการผสานเรียงลำดับครึ่งแรกและครึ่งหลังของรายการแยกต่างหากจากนั้นรวมรายการที่เรียงลำดับ เรียงแพนเค้ก องค์ประกอบย้อนกลับของคำนำหน้าบางลำดับ จัดเรียงช่องพิราบ เติมอาร์เรย์ว่างด้วยองค์ประกอบทั้งหมดของอาร์เรย์ที่จะเรียงลำดับตามลำดับ จัดเรียงบุรุษไปรษณีย์ ชุดการเรียงลำดับลำดับชั้นใช้โดยที่ทำการไปรษณีย์ quicksort แบ่งรายชื่อออกเป็นสองส่วนด้วยรายการทั้งหมดในรายการแรกที่มาก่อนรายการทั้งหมดในรายการที่สอง จากนั้นเรียงลำดับสองรายการ มักจะเป็นวิธีการเลือก เรียง Radix เรียงลำดับคีย์ที่เชื่อมโยงกับรายการหรือจำนวนเต็มด้วยการประมวลผลตัวเลข เรียงลำดับการคัดเลือก เลือกองค์ประกอบที่เล็กที่สุดจากนั้นเพิ่มไปยังส่วนท้ายของรายการที่เรียงลำดับ เรียงเปลือกปรับปรุงการเรียงลำดับการแทรกด้วยการใช้ช่องว่างระหว่างค่า Smoothsort ดูฮีปพอร์ต จัดเรียงสุ่ม ดู Bogogort

และอื่น ๆ อีกมากมาย...


0

คุณได้ถามคำถามสองข้อในหัวข้อคำถามดังนั้นฉันจะตอบทั้งสองคำถาม

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

ไม่การเขียนโปรแกรมไม่ได้เกี่ยวกับอัลกอริทึม การเขียนโปรแกรมเป็นเรื่องเกี่ยวกับการกำหนดรายละเอียดและแปลงให้เป็นรหัสซึ่งสามารถรวบรวมเพื่อดำเนินการ

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

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