การรู้วิธีการโปรแกรมสำหรับ TCS สำคัญอย่างไร


66

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

ฉันสามารถจินตนาการได้ว่าสักวันฉันอาจต้องใช้อัลกอริทึมสำหรับงานของฉัน แต่แล้วฉันจะรอช่วงเวลานี้ได้หรือไม่ หรือมีอะไรอีกไหม?

ความสำคัญในการรู้วิธีการรหัสใน TCS (ในสาขาที่การเขียนโปรแกรมไม่เกี่ยวข้องโดยตรง): มีเหตุผลที่จะนำทฤษฎี CC (เช่น) รู้วิธีการรหัส? มันมีค่าใช้จ่ายมากเวลาเรียนรู้วิธีการรหัส? และถ้ามีมีหมวดหมู่ (การทำงาน, ความจำเป็น, เชิงวัตถุ .. ) ของการเขียนโปรแกรมภาษาที่จะเหมาะกว่า?


12
คุณควรตั้งโปรแกรมบางอย่างเพื่อเขียนความหมายเช่นรหัสที่แน่นอนและการสะท้อนกลับรันไทม์รหัสหลอก นักคณิตศาสตร์มักไม่ทำเช่นนั้น นอกจากนี้หากคุณต้องการใช้ทฤษฎีที่คุณพัฒนาขึ้นมาจริง ๆโอกาสที่คุณจะต้องทำอะไรบางอย่าง สำหรับภาษาคุณน่าจะเรียนรู้สิ่งที่ใช้งานได้ดีกว่า C นั้นดีสำหรับการแสดง แต่ก็ยากที่จะคิดและยุ่งในหลาย ๆ ด้าน (อย่างที่คุณเห็น YMMW)
Raphael

6
ฉันเห็นด้วยกับ "นักคณิตศาสตร์มักจะไม่ทำเช่นนั้น" การทดสอบที่ง่ายสำหรับการไม่ว่าจะเป็นนักคณิตศาสตร์อธิบายขั้นตอนวิธีที่เคยมีโปรแกรมจริงๆคือการขอให้ "สิ่งที่ว่าที่คุณหมายถึง 'ได้รับเครื่องหมาย X ... ?"
Jeff

4
การเขียนโปรแกรมคืออะไร ทฤษฎีคือโปรแกรมของฉัน ขั้นตอนการทำอาหารแตกต่างจากศิลปะการทำอาหาร ขออภัยในกว่า 20 ปีฉันไม่สามารถอ่านรหัสโปรแกรมใด ๆ ได้ ที่จริงแล้วฉันเกลียดสิ่งนี้ "การตระหนักในพีซี" (แล้วสัญกรณ์นี้ทำให้ป่วย) Euclid ไม่สามารถโปรแกรมได้ แต่เขาก็ทำโปรแกรมมาหลายศตวรรษ
Stasys

6
@StasysJukna: Euclid เป็นนักเขียนโปรแกรมที่เส็งเคร็งจริงๆ เขาไม่เพียง แต่ไม่เคยใช้อัลกอริธึมของเขาเท่านั้นเขาไม่เคยใช้มันกับกรณีทดสอบที่ซับซ้อนปานกลาง
Jeff

3
@ Jɛ ff E: ใช่ Euclid เป็นโปรแกรมเมอร์เส็งเคร็งตรงนี้ฉันอยากจะพูด เราใน TCS มีแนวโน้มที่จะไม่แยกความแตกต่างระหว่างหนังสือทำอาหารกับศิลปะการตบมือ Euclid ทำได้ ฉันมีความเคารพอย่างมากกับคนที่สามารถโปรแกรม แต่ฉันไม่คิดว่าคุณสมบัตินี้หมายถึง "หนึ่ง CAN ใน TCS" มันจะไม่เจ็บ
Stasys

คำตอบ:


55

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

ก่อนอื่นถ้าคุณออกแบบอัลกอริทึมสำหรับปัญหาที่มีความสำคัญในทางปฏิบัติการใช้อัลกอริทึมของคุณและทำให้ผู้อื่นสามารถใช้งานโค้ดได้ ตัวอย่างเช่นปัญหาตัวนูนเกิดขึ้นในหลายสาขาและผู้คนใช้แพคเกจซอฟต์แวร์เช่นcddโดยKomei Fukuda และlrsโดย David Avis เพื่อแก้ไขปัญหานี้ หากพวกเขาเผยแพร่อัลกอริทึมของพวกเขาเฉพาะในเอกสารอาจมีคนน้อยกว่าที่จะใช้อัลกอริทึมของพวกเขา ผู้ใช้มากขึ้นหมายถึงข้อเสนอแนะมากขึ้นและอาจมีโอกาสมากขึ้นในการทำงานร่วมกันซึ่งมีค่ามาก

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

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

โดยวิธีการเขียนโปรแกรมยังสามารถสนุก


2
@SureshVenkat: อันที่จริงถ้าการเขียนโปรแกรมสนุกคำถาม“ ความสำคัญคือการเขียนโปรแกรมหรือไม่” อาจไม่เกี่ยวข้องกันมาก แต่ส่วนใหญ่ของคำตอบของฉันจะไม่เกี่ยวข้อง ช่างน่าเศร้าจริงๆ! :)
Tsuyoshi Ito

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

@Gopi: ที่กล่าวว่าการคาดเดาจำนวนมากไม่เหมาะกับกรอบ "ทดสอบด้วยโปรแกรมที่ง่าย" นี้ ตัวอย่างเช่นเรามักจะไม่สามารถทดสอบพฤติกรรมแบบอะซิมโทติค (อย่างน้อยโดยโปรแกรมอย่างง่าย) แต่เมื่อคุณมีการคาดเดาที่สามารถทดสอบได้การเขียนโปรแกรมเล็กน้อยอาจเป็นเครื่องมือที่ทรงพลัง สำหรับความสนุกใช่ฉันเข้าใจ ฉันไม่ต้องการเพิกเฉยต่อมุมมอง“ สนุก” เพียงแค่แสดงแรงจูงใจบางอย่างจากมุมมอง“ มีประโยชน์”
Tsuyoshi Ito

3
บันทึกของ Knuth ในชั้นเรียนการแก้ปัญหามีตัวอย่างที่ยอดเยี่ยมของการมีปฏิสัมพันธ์ระหว่างการคาดเดาและรหัส (ดูปัญหา 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (โดยเฉพาะอย่างยิ่งฉันชอบภาพของใครบางคน วิ่งเข้ามาในห้องเรียนพร้อมกับงานพิมพ์จำนวนมาก)
Suresh Venkat

47

ฉันรู้สึกถูกบังคับให้อ้าง Doron Zeilberger เกี่ยวกับเรื่องนี้:

ความเห็นที่ 37 : การเขียนโปรแกรมเป็นเรื่องสนุกยิ่งกว่าการพิสูจน์และที่สำคัญยิ่งกว่านั้นคือให้ความรู้และความเข้าใจ

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

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

นอกเหนือจากนั้นหากคุณทำงานกับอัลกอริทึมและโครงสร้างข้อมูลการเขียนโปรแกรมจะให้มุมมองที่ไม่สามารถถูกแทนที่ได้ในประเด็นของประสิทธิภาพและการใช้งาน ความคิดเห็นของฉันที่นี่แตกต่างกับคนอื่นบ้าง ฉันคิดว่าการเรียนรู้ภาษาที่ใช้งานได้เพื่อให้คุณได้เขียนหลักฐานที่พิมพ์ได้อย่างถูกต้องนั้นเป็นการเสียเวลา (ฉันคิดว่ามันเป็นจุดที่ดีที่คนที่มีประสบการณ์กับภาษาที่พิมพ์อย่างรุนแรงอาจมีแนวโน้มที่จะเขียนหลักฐานที่มีโครงสร้างอย่างระมัดระวังมากขึ้น คิดว่ามันคุ้มค่ากับเวลาที่ต้องทำแบบฝึกหัดนั้น) ฟังก์ชั่นการเขียนโปรแกรมปิดบังปัญหาของการออกแบบอัลกอริทึมและเวลาทำงานและเน้นปัญหาตรรกะและความหมาย (และแน่นอนการเรียนรู้การเขียนโปรแกรมฟังก์ชั่นอาจจะต้องและจะมาค่อนข้างตามธรรมชาติถ้าคุณสนใจตรรกะ / ความหมาย PL) ในทำนองเดียวกัน ฉันคิดว่าการลงรายละเอียด OO ของ Java และ C ++ นั้นไม่ใช่วิธีที่เหมาะสมที่สุดในการใช้เวลาของคุณเนื่องจากจุดประสงค์ของ OO คือการเขียนโค้ดที่สามารถใช้งานได้แบบแยกส่วน มันเป็นวิธีที่จะไปถ้าคุณจะสร้างรหัสให้ผู้อื่นใช้ แต่ในกรณีที่คุณต้องการรับข้อมูลเชิงลึกเกี่ยวกับประสิทธิภาพและเวลาในการทำงานหากคุณสนใจอัลกอริธึมและโครงสร้างข้อมูลที่มีประสิทธิภาพจริงๆฉันขอแนะนำให้คุณดู C ซึ่งจะช่วยให้คุณอยู่ใกล้กับเครื่องในขณะที่ยังคงให้นามธรรม . วิธีนี้ทำให้คุณรู้สึกว่ามีอะไรเร็วและช้าอะไรคือโครงสร้างข้อมูลที่เหมาะสม ฯลฯ แต่ในกรณีที่คุณต้องการรับข้อมูลเชิงลึกเกี่ยวกับประสิทธิภาพและเวลาในการทำงานหากคุณสนใจอัลกอริธึมและโครงสร้างข้อมูลที่มีประสิทธิภาพจริงๆฉันขอแนะนำให้คุณดู C ซึ่งจะช่วยให้คุณอยู่ใกล้กับเครื่องในขณะที่ยังคงให้นามธรรม . วิธีนี้ทำให้คุณรู้สึกว่ามีอะไรเร็วและช้าอะไรคือโครงสร้างข้อมูลที่เหมาะสม ฯลฯ แต่ในกรณีที่คุณต้องการรับข้อมูลเชิงลึกเกี่ยวกับประสิทธิภาพและเวลาในการทำงานหากคุณสนใจอัลกอริธึมและโครงสร้างข้อมูลที่มีประสิทธิภาพจริงๆฉันขอแนะนำให้คุณดู C ซึ่งจะช่วยให้คุณอยู่ใกล้กับเครื่องในขณะที่ยังคงให้นามธรรม . วิธีนี้ทำให้คุณรู้สึกว่ามีอะไรเร็วและช้าอะไรคือโครงสร้างข้อมูลที่เหมาะสม ฯลฯ


10
"ฟังก์ชั่นการเขียนโปรแกรมบดบังปัญหาของการออกแบบอัลกอริทึมและเวลาทำงานและเน้นปัญหาตรรกะและความหมาย" คำต่อสู้ :)
Suresh Venkat

3
"ฟังก์ชั่นการเขียนโปรแกรมบดบังปัญหาของการออกแบบอัลกอริทึมและเวลาทำงานและเน้นปัญหาตรรกะและความหมาย" นี่คือเหตุผลที่เป็นตัวเลือกที่ดีถ้าคุณทำงานในด้านตรรกะหรือซีแมนทิกส์ของ TCS :)
Radu GRIGore


3
@Sasho: เทคนิคสามัญทั้งหมดยังคงทำงานในภาษาที่ใช้งานได้ "ปัญหา" เพียงอย่างเดียวคือการเขียนโปรแกรมการทำงานสนับสนุนรูปแบบของการเขียนโปรแกรมและการออกแบบโครงสร้างข้อมูลซึ่งเทคนิคสามัญของการวิเคราะห์อัลกอริทึมอยู่ภายใต้ความพร้อมที่จะจัดการ (เช่นอะไรคือองค์ประกอบใหญ่ของฟังก์ชั่นการดำเนินการเป็นเรื่องเล็กน้อยแต่มันทำลายสมมติฐานที่ซับซ้อนของความซับซ้อนแบบซีมโทติค - ไม่มีตัวชี้วัดขนาดตัวเลขที่ง่ายสำหรับอินพุตที่ใช้งานได้)
Neel Krishnaswami

3
@SashoNikolov: เมื่อใดก็ตามที่ฉันสอนชั้นโครงสร้างข้อมูลระดับบัณฑิตศึกษาฉันหวังว่าฉันจะสมมติว่าทุกคนมีประสบการณ์การเขียนโปรแกรมที่ใช้งานได้จริง แทนที่จะใช้เวลาบรรยาย 90 นาทีสามครั้งเพื่ออธิบายการคงอยู่ฉันสามารถพูดว่า "เฮ้คุณสังเกตเห็นไหมว่าโครงสร้างข้อมูลของคุณทำสิ่งนี้แล้ว?"
Jeffε

33

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

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

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

คุณควรเรียนภาษาอะไร ฉันแนะนำภาษาเชิงวัตถุเนื่องจากเป็นภาษาที่มีการใช้งานมากที่สุดในปัจจุบันและฉันสงสัยว่านี่จะเป็นจริงมากขึ้นในอนาคต บางที Python หรือ Java - ทั้งภาษาเชิงวัตถุและในขณะที่พวกเขาใช้ในทางปฏิบัติน้อยกว่า C ++ ความประทับใจของฉันคือพวกเขาทั้งคู่เรียนรู้ได้ง่ายกว่ามาก (Caveat: ฉันไม่รู้ C ++ แม้จะเคยทำงานที่ Bell Labs ดังนั้นฉันอาจผิดเกี่ยวกับเรื่องนี้)


2
ฉันเห็นความจริงในย่อหน้าที่สามของคุณ :)
Gopi

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

2
ด้วยการเพิ่มขึ้นของ Sage มันเป็นไปได้ที่จะทำงานกับภาษาที่นิยมและดีเช่น Python ในขณะที่ยังมีไลบรารี่คณิตศาสตร์ Mathematica / Maple / Matlab ที่พร้อมใช้งานทันที
András Salamon

1
C ++ มีระบบการพิมพ์ / metaprogramming ที่ทันสมัยที่สุดของภาษาการเขียนโปรแกรมวัตถุประสงค์ทั่วไปที่ฉันเคยเห็นยกเว้นตระกูลภาษา Lisp ดังนั้นหากคุณเป็นทฤษฎีประเภทการออกแบบภาษาหรือทฤษฎีคอมไพเลอร์หรือมากกว่าในความหมายที่เป็นทางการคุณอาจต้องการทำความคุ้นเคยกับมัน นอกจาก C ++ แล้ว Java และ C # เป็นสิ่งที่จำเป็นถ้าคุณต้องการทำวิจัยในสาขาวิทยาศาสตร์คอมพิวเตอร์ทดลองหรือหวังว่าจะได้งานเป็นโปรแกรมเมอร์หรือวิศวกรซอฟต์แวร์ในอุตสาหกรรม Python ควรได้รับการสอนในโรงเรียนมัธยม: D
Antonio Valerio Miceli-Barone

4
@ AntonioValerioMiceli-Barone: ฉันต้องไม่เห็นด้วยอย่างน้อยสำหรับทฤษฎีประเภทการออกแบบภาษาความหมายที่เป็นทางการและทฤษฎีภาษาโปรแกรม (PLT) โดยทั่วไป: C ++ ไม่ใช่ภาษาที่จะเรียนรู้สำหรับสาขาเหล่านั้น TT และซีแมนทิกส์ที่เป็นทางการนั้นเกี่ยวข้องกับการเขียนโปรแกรมเชิงฟังก์ชันเกือบทั้งหมดในขณะที่ชุมชน PL มีความหลากหลายมากกว่า แต่ชอบภาษาที่มากกว่า C ++ Haskell เป็นภาษา "กระแสหลัก" ที่มีระบบการพิมพ์ขั้นสูงสุดตามด้วยสกาลา (ขั้นสูงน้อยกว่าเป็นกระแสหลักที่สำคัญกว่าเล็กน้อย) C ++ มีคุณสมบัติที่น่าสนใจ แต่ต่ำเกินไปสำหรับรสนิยมสมัยใหม่
Blaisorblade

33

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

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

ในระยะสั้นความสามารถในการใช้รหัสช่วยให้คุณรับรู้ข้อบกพร่องและจุดอ่อนในสิ่งที่อาจมีลักษณะผลลัพธ์ทางทฤษฎีที่ดีที่สุดและในทางกลับกันจะเปิดทิศทางการวิจัยเชิงทฤษฎีใหม่


คำตอบของคุณอาจจะสามารถช่วยในคำถามเกี่ยวกับผลเชิงประจักษ์ใน TCS
Gopi

อาจจะ: แต่ด้ายนั้นเสียชีวิตไปนานแล้ว :)
Suresh Venkat

อันที่จริงฉันไม่ได้ดูวันที่มันเป็นในจดหมายข่าวล่าสุดที่ฉันได้รับในส่วน "ความนิยมที่ยิ่งใหญ่ที่สุดจากสัปดาห์ก่อน" =)
Gopi

18

สามคะแนน:

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

2) เมื่อคุณเรียนรู้วิธีการเขียนโปรแกรมเนื่องจากผลพลอยได้คุณได้เรียนรู้ทักษะที่มีประโยชน์ใน TCS ตัวอย่างข้างต้นทั้งหมด: ฉันพบว่าคนที่มีพื้นหลังการเข้ารหัสมักจะตรวจสอบหลักฐานเพิ่มเติม ยิ่งไปกว่านั้นพวกเขามักจะกำหนดประเภทของวัตถุที่พวกเขากำลังพิจารณาอยู่บ่อยครั้ง (เช่น: "ลองพิจารณาตัวดำเนินการและนี่เป็นสิ่งที่ดี สำหรับผู้อ่านต้นฉบับ Compilers (และล่าม) เปลี่ยนเราให้เป็นนักวิทยาศาสตร์ที่ดี :) สำหรับทักษะประเภทนี้ฉันรู้สึกว่าจะแนะนำภาษาที่ใช้งานได้ดีบางชนิดB L ( Y , C )AL(X,Y)BL(Y,C)

3) เมื่อคุณพูดว่า "to program" คุณหมายถึง "to linear program " หรือ "to semidefinite program " หรือไม่ :)


2
ฉันรู้ว่าไม่มีใครใช้ "to program" สำหรับ "to linear program" หรือ "to semidefinite program" คุณจะพูดว่า "เพื่อสร้าง / แก้โปรแกรมเชิงเส้น" แทน
Peter Shor

2
@PeterShor Point 3 ไม่ร้ายแรง
Alessandro Cosentino

3
และแน่นอนคุณควรเรียนรู้โปรแกรมเชิงเส้นและโปรแกรม semidefinite ... ทั้งทักษะที่มีประโยชน์
Peter Shor

3
+1 สำหรับจุดที่ 2 จริง ๆ แล้วฉันได้รับการสอน OCaml เล็กน้อยเมื่อฉันเป็นนักศึกษาระดับปริญญาตรีถึงแม้ว่าฉันจะใช้มันเพียงหนึ่งปีฉันก็ติดนิสัยเพื่อตรวจสอบประเภทของการพิสูจน์ของฉัน
Gopi

4
ฉันโปรแกรมแบบไดนามิก !
Jeffε

16

ขอบคุณ Gopi สำหรับคำถามนี้ ฉันต้องการขยายคำตอบที่น่าสนใจมากมายในอีกมิติหนึ่งที่ยังไม่ได้กล่าวถึง

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

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


“ ถ้าคุณโชคดีคุณจะต้องสอนหลักสูตรที่ค่อนข้างไกลจากความเชี่ยวชาญของคุณ” โชคดีใช่ไหม…?
Tsuyoshi Ito

3
@ Tsuyoshi: มันบังคับให้คุณทำความคุ้นเคยกับหัวข้อใหม่ ในระยะสั้นหมายถึงงานจำนวนมาก (ซึ่งตัดจำหน่ายในระยะยาวเนื่องจากคุณมีแนวโน้มที่จะสอนเนื้อหานี้มากกว่าหนึ่งครั้ง) ในขณะเดียวกันก็เป็นการขยายขอบเขตทางปัญญาของคุณอย่างมาก
Martin Berger

@TsuyoshiIto: ใช่!
Jeffε

13

การเขียนโปรแกรมเป็นวิธีที่ดีในการปรับปรุงความเข้าใจแนวคิดต่าง ๆ ของคุณ แต่มันก็เป็นช่วงเวลาที่อันตรายเช่นกัน

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

สำหรับภาษาโปรแกรมที่จะเรียนรู้: "พวกเขาทั้งหมด" เป็นคำตอบของฉัน (ลิ้นในแก้ม)


2
สรุปอาร์กิวเมนต์กับการเขียนโปรแกรม :)
Gopi

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

6
การพิสูจน์ทฤษฎีบทก็เป็นวิธีที่ดีในการปรับปรุงความเข้าใจแนวคิดต่าง ๆ แต่ก็เป็นช่วงเวลาที่อันตรายเช่นกัน
Jeffε

@ Jɛ ff E ความเห็นของฉันถูกเก็บรักษาไว้โดยการแทนที่ [pseudocode-> พิสูจน์บนกระดาษรหัส -> พิสูจน์ในผู้ช่วยพิสูจน์]
Radu GRIGore

12

ฉันไปงานปาร์ตี้สายและนี่เป็นคำตอบที่ดี แต่ฉันมีเหตุผลอื่น:

การแสดง

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


3
ฉันรู้วิธีการเขียนโปรแกรมและฉันก็หมดหวังอย่างยิ่งในการสร้างภาพข้อมูล ฉันยังสงสัยว่ามีเครื่องมือที่จะช่วยให้คุณเห็นภาพสิ่งต่าง ๆ โดยไม่ต้องเขียนโปรแกรมมากมาย หากไม่มีก็ควรจะมีและอาจจะเป็นในไม่กี่ปี
Peter Shor

@PeterShor: เพราะคุณไม่ได้ใช้ C ++! (ล้อเล่น)
Tsuyoshi Ito

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

@ จอห์น ... ถูกต้องฉันไม่คิดว่าคุณจะทำอย่างอื่นได้
Peter Shor

7

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


Tsuyoshi Ito เขียนอาร์กิวเมนต์ที่คล้ายกันในคำตอบของเขา (จุดที่สอง :)
Gopi

โอ๊ะคุณพูดถูก - ฉันพลาดไป
เลฟเรย์ซิน

5

ไม่มีใครพูดถึงประเด็นการปฏิบัติว่าทำไมคนที่เรียน TCS ควรเรียนรู้การเขียนโปรแกรม

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

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

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

ฉันแนะนำให้เรียน C (ไม่ใช่ C ++) รับสำเนา K&R และอ่านจากด้านหน้าไปด้านหลัง C ไม่ได้มีคุณสมบัติที่แปลกใหม่ของภาษาสมัยใหม่ แต่มันมีไวยากรณ์และความหมายที่เรียบง่าย แต่สง่างามซึ่งคุณควรจะสามารถเรียนรู้ได้อย่างครบถ้วน อย่างไรก็ตามแม้ว่าคุณจะเข้าใจภาษาได้อย่างสมบูรณ์ แต่ก็ยังคงฝึกฝนให้ฝึกการเขียนโค้ดที่ไม่มีข้อบกพร่องที่สง่างามใน C อย่างไรก็ตามหากคุณสามารถเขียนโค้ดใน C ได้คุณจะสามารถเชี่ยวชาญภาษาการเขียนโปรแกรมที่คุณพบ นอกจากนี้วินัยนั้นจะช่วยให้คุณคิดว่าฮาร์ดแวร์คิดอย่างไรซึ่งจะเป็นประโยชน์เมื่อออกแบบอัลกอริทึม

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


0

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

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

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

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

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

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

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

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


4
ฉันไม่รู้ว่าคุณตอบคำถามเดิมมากแค่ไหน: ฉันไม่ได้ถามว่า "ทำอย่างไร" แต่มีอะไรมากกว่านี้อีก
Gopi

0

ตัวอย่างของการนำ C ++ ไปใช้งานของระบบพิสูจน์แบบโต้ตอบมีเอกสารดังต่อไปนี้: หลักฐานการโต้ตอบที่เหมาะสมที่สุดสำหรับการประเมินวงจรโดย Justin Thaler มันสามารถใช้ได้ที่http://people.seas.harvard.edu/~jthaler/ ดูเหมือนจะเป็นก้าวต่อไปสู่เป้าหมายของการพัฒนาการใช้งานจริงของระบบพิสูจน์การโต้ตอบทั่วไป

เอกสารที่คล้ายกันและซอร์สโค้ดที่เกี่ยวข้องปรากฏในเว็บไซต์ที่กล่าวถึงข้างต้น


3
คุณจะอธิบายว่าบทความนี้เกี่ยวข้องกับคำถามเช่นการรู้วิธีการเขียนโปรแกรมสำหรับ TCS สำคัญอย่างไร
scaaahu

แม้ว่ามันจะเป็นตัวอย่างของผลทางทฤษฎีที่ได้รับประโยชน์จากการเขียนโปรแกรมมันจะไม่ตอบคำถามเดิมหรือไม่?
Jeremy

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