สูตรทางคณิตศาสตร์ที่ดีที่ควรทราบสำหรับการเขียนโปรแกรมมีอะไรบ้าง [ปิด]


19

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

ตัวอย่าง: ฉันเรียนรู้เกี่ยวกับสูตรระยะทาง ecludian: sqrt((x1-x2)^2+(y1-y2)^2)ซึ่งช่วยให้ฉันเข้าใจวิธีการค้นหาเช่นวัตถุโดยเปรียบเทียบ 2 ปัจจัย


2
ฉันไม่คิดว่านั่นคือสูตรระยะทางแบบยุคลิด
เกร็กฮิวกิล

@Larry @Greg แก้ไขแล้ว
GSto

ฮ่า ๆ ๆ แล้วลำดับฟีโบ้ดีสำหรับการเปรียบเทียบ
aggietech

1
วันที่เสร็จสมบูรณ์ = (วันที่ประมาณ + จำนวนวันที่เหลือ / 2) ^ (เวลาในที่ทำงาน / เวลาที่บ้าน) * จำนวนฟรีพิซซ่า
Skizz

7
คุณอาจพบว่ามันน่าสนใจที่จะรู้ว่าถ้าคุณต้องการเปรียบเทียบระยะทางคุณสามารถข้ามsqrtขั้นตอนนี้ไปได้ สำหรับวงในที่แน่นซึ่งอาจมีความสำคัญ

คำตอบ:


16

การรู้พลังของ 2 นั้นมีประโยชน์โดยเฉพาะเมื่อต้องรับมือกับการทำงานระดับบิตบิตในระดับต่ำ


+1 - ความสามารถในการแปลงจากฐาน 2, 16, 10 และ 8 เป็นสิ่งที่จำเป็น
mouviciel

2
ฉันไม่แน่ใจเกี่ยวกับ base-8 แต่ฉันเห็นด้วยกับ 2,16 และการแปลง 10 คุณควรจะสามารถทำได้ในเวลาที่เหมาะสม แต่ไม่จำเป็นต้องทำทันที
ไม่ระบุตัวตน

ครูคนหนึ่งของฉันเป็นสัตว์จำพวก Hex เปลี่ยนมาอยู่ในหัวของเขาไร้สาระและฉันก็เป็น TA สำหรับเขาเป็นเวลาหนึ่งปีหรือมากกว่านั้นชั้นเรียนก็ประทับใจเสมอเช่นเดียวกับฉัน
Chris

ฉันเกลียดฐาน 8 :)

1
ด้วยแมโคร enums และ bitfields ในภาษาที่ทันสมัยในสิ่งที่กรณีคนจำเป็นต้องรู้อำนาจของ 2 ซึ่งเป็นพื้นฐานหมายเลขมายากล .. setsockopt(...SO_KEEPALIVE..)ค่อนข้างมากง่ายต่อการอ่านหรือเขียนกว่าsetsockopt(...16...)
JBRWilkinson

15

พีชคณิตบูลีนถูกกล่าวถึงแล้ว แต่ฉันต้องการที่จะให้ตัวอย่างการปฏิบัติ

พีชคณิตแบบบูลมามีประโยชน์มากมักจะเมื่อคุณทำงานกับนิพจน์บูลีนที่ซับซ้อน (ในifงบตัวอย่าง)

คู่สำนวนและกฎหมายที่มีประโยชน์:

distributivity

A & (B | C) = (A & B) | (A & C)

A | (B & C) = (A | B) & (A | C)

ดังนั้นครั้งต่อไปที่คุณสะดุดเมื่อพูดเช่นนี้:

if((A || B) && (A || C) && (A || D) && (A || E)) { ... }

คุณสามารถย่อขนาดเป็น:

if(A || (B && C && D && E)) { ... }

กฎหมายของการปฏิเสธและเดมอร์แกน

! (! A) = A

! (A & B) =! A | ! B

! (A | B) =! A &! B

ให้บอกว่าคุณมีคำสั่งดังกล่าว:

if(!A && !B && !C) {..}

และคุณต้องสร้างสิ่งที่ตรงกันข้าม การเขียน:

if(!(!A && !B && !C)) {...}

จะใช้งานได้ แต่ไม่ดูเท่ห์เท่านี้:

if(A | B | C) {...}

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

และนั่นคือที่ซึ่งแผนที่ Karnaugh สามารถช่วยได้ มันใช้งานได้ดีกับธงบูลีนสูงสุด 4 รายการพร้อมกัน แต่ถ้าคุณต้องการมากขึ้น - ขอให้โชคดี!
งาน

3
+1 สำหรับกฎของ De Morgan ฉันประหลาดใจที่ดูเหมือนว่ามีคนเพียงไม่กี่คนที่ได้รับการสอนและรู้วิธีนำไปใช้
Fortyrunner

(P -> Q) <=> (!P | Q)คุณลืมคนนี้: ฉันใช้มันตลอดเวลาเนื่องจากมีสภาพแวดล้อมน้อยมากที่เสนอตัวดำเนินการทางตรรกะนี่คือความเท่าเทียมที่มีประโยชน์มากสำหรับข้อ จำกัด SQL CHECK
mu สั้นเกินไป

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

9

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

หากคุณต้องการคำนวณอะไรบางอย่างมักจะมีฟังก์ชั่นในห้องสมุดหรือซอร์สโค้ดตัวอย่างที่สามารถคำนวณให้คุณได้ ตัวอย่างเช่นฟังก์ชัน PMT () ของ Excel ที่คำนวณการชำระเงินที่จำเป็นสำหรับการชำระหนี้ที่ X% ในช่วง Y คุณต้องการรู้วิธีคำนวณหรือไม่หรือว่ามันเพียงพอที่จะเรียกใช้บิวด์อินหรือไม่?

ในช่วง 10 ปีที่ผ่านมาฉันไม่คิดว่าฉันจะต้องใช้อะไรจากห้องสมุดคณิตศาสตร์อื่นนอกเหนือจาก Ceil (), Min () และ Max () ซึ่งแสดงให้เห็นว่าแม้ว่าคอมพิวเตอร์จะได้รับการคิดค้นเพื่อแก้ไขปัญหาทางคณิตศาสตร์ การใช้งานทั่วไปในปัจจุบันคือการตัดสินใจเกี่ยวกับการไหลของข้อมูล

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

ใช่มีตลาดที่ต้องการคณิตศาสตร์จำนวนมาก - การเงิน, ฟิสิกส์, วิศวกรรม - แต่ในอุตสาหกรรมเหล่านี้วินัยหลักของคุณมีแนวโน้มที่จะเป็นคณิตศาสตร์ / เศรษฐศาสตร์, ฟิสิกส์, วิศวกรรม, ฯลฯ ดังนั้นคำถามของคุณจะเป็น 'ฉันจะเขียนได้อย่างไร สูตร f (x) ในภาษา Y? '

การใช้เวลาของคุณให้ดีขึ้น IMO คือการตรวจสอบอัลกอริทึม (รวมถึงสัญลักษณ์ Big O) และรูปแบบการออกแบบ


1
+1 เพราะดูเหมือนว่าเป็นข้อความที่สมเหตุสมผล - ไม่มีสูตรเฉพาะที่คุณควรรู้ แต่แนวคิดของความซับซ้อนของอัลกอริทึม (สัญกรณ์ O ใหญ่) มีความสำคัญมาก
Michael H.

คณิตศาสตร์ที่มากมาย ... ตัดสินใจเลือกโฆษณาที่จะทำให้คุณรำคาญใจ

ฉันเห็นด้วยกับจำนวนคณิตศาสตร์ที่ต้องการโดยทั่วไปแล้วค่อนข้างต่ำแม้ว่าประสบการณ์ของฉันจะไม่ต่ำเท่าของคุณ - ฉันลงเอยด้วยการใช้ทริกเกอร์ในกราฟิกเป็นระยะ
Loren Pechtel

7

ไม่มีสูตรที่สามารถทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นได้

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

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

-1 ชายคนนั้นถามเกี่ยวกับสูตรคณิตศาสตร์ที่มีประโยชน์ ฉันไม่อยากจะเชื่อเลยว่าคำตอบนี้ถูกยกระดับขึ้นเลย
Jas


6

ฉันต้องการพูดถึงชุด Taylorซึ่งค่อนข้างมีประโยชน์ในการรับฟังก์ชั่น "หนักกว่า" อย่างรวดเร็ว ยกตัวอย่างเช่นsin(x)รอบ 0 x-(x*x*x/6)สามารถประมาณด้วย

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


3

กฎของเดอมอร์แกนเกี่ยวกับการเปลี่ยนบูลีน "และ" และ "หรือ" เมื่อเทียบกับการปฏิเสธ


2

Rule of Three (ชนิดของการคูณไขว้)

+1 สำหรับสูตรสถิติพื้นฐาน

ฉันเห็นคนจำนวนมากที่มีความยากที่จะใช้กฎง่ายๆนี้กับรหัสพื้นฐาน


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

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

@ Job: ในโลกแห่งทฤษฎีนี่เป็นเรื่องจริง!
Pagotti

2

คณิตศาสตร์ลำดับและอนุกรม

ฉันเคยเห็นโรงเรียนสอนมากเกินไป "เขียนวนเพื่อรวมตัวเลขทั้งหมดระหว่าง x และ y" แทนที่จะเป็น "อัลกอริทึมที่น่ากลัว"

นอกจากนี้ ... https://docs.google.com/viewer?url=http://courses.csail.mit.edu/6.042/fall10/mcs-ftl.pdf


2

กฎแห่ง Cosinesสำคัญมากสำหรับปัญหาเรขาคณิตมากมาย

ข้อความแสดงแทน

การกำหนดมุมโดยเฉพาะ


แกมม่าในสมการนั้นคืออะไร?
Matt Ellen

1
@ Matt Ellen: มุมของฝั่งตรงข้าม C (IOW มุมระหว่าง A และ B)
Lie Ryan

2
และแน่นอนกรณีพิเศษสำหรับรูปสามเหลี่ยมมุมฉาก:a^2 + b^2 = c^2
หมายเหตุถึงตัวเอง - คิดชื่อ

2

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


2

วิธีการพิสูจน์

สิ่งที่ฉันใช้กับความถี่สัมพัทธ์:

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


2

T (n) = aT (n / b) + f (n), a> = 1, b> 1

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


1
ทำไมจึงเป็นเรื่องดีสำหรับการเขียนโปรแกรม
Matt Ellen

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

1
  • พีชคณิต
  • ตรีโกณมิติ
  • เวกเตอร์ (การดำเนินงานเมทริกซ์)
  • แคลคูลัส
  • [การแก้ไขที่หลากหลายและอนุพันธ์ของพวกเขา]
  • [พื้นผิว NURBS]

(สิ่งที่อยู่ในวงเล็บคือประเภท "นำไปใช้" มากกว่า)

เป็นการยากที่จะบอกทิศทางทั่วไปเนื่องจากมันขึ้นอยู่กับสาขาที่คุณเข้าเรียน แต่สิ่งที่กล่าวมาข้างต้นครอบคลุมพื้นฐานของปริญญาวิศวกรรมศาสตร์ค่อนข้างมาก โปรดทราบว่าหมวดหมู่เหล่านี้มักจะทับซ้อนกัน (ตรีโกณมิติ + เมทริกซ์ ops. แคลคูลัส + เมทริกซ์ ops. และอื่น ๆ )

ฉันมีคู่มือคณิตศาสตร์อยู่เสมอ มักจะไม่แน่ใจในบางสิ่งบางอย่างและช่วยในการนำเสนออย่างเป็นระเบียบ


1

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

if (x < 10)
    return true;
else
    return false;

ฉันไม่แน่ใจว่าฉันเข้าใจว่าพีชคณิตแบบบูลช่วยป้องกันผู้ใช้จากการเขียนได้อย่างไร คุณช่วยเสนอสิ่งที่ผู้ใช้ควรเขียนที่นั่นได้ไหม? (ฉันจะถือว่าผลตอบแทน x <10 แต่อาจเข้าใจผิด)
Chris

1
คุณถูกต้อง - ควรจะส่งคืน x <10 คิดแบบนี้ การประเมิน (x <10) จะส่งคืนผลลัพธ์บูลีน คำสั่ง if จะแยกย่อยเป็น [ถ้า x น้อยกว่า 10] ถ้า (จริง) คืนค่าจริง หรือ [ถ้า x มากกว่าหรือเท่ากับ 10] ถ้า (เท็จ) ... อื่นกลับเท็จ;
Eric Olsson

2
(x <10) อาจแยกสองกรณีธุรกิจ ด้วยฟอร์ม verbose คุณสามารถทำได้มากกว่าแค่การคืนค่าซึ่งในโหมดการบำรุงรักษานั้นดีมากเนื่องจากคุณสามารถทำการเปลี่ยนแปลงขั้นต่ำได้

1

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

log( Product( exp( -(x[i]-mean)^2 )) )
  =
  - Sum( (x[i]-mean)^2 )

รายการโปรดอื่น ๆ ในขอบเขตของการปรับแต่งประสิทธิภาพคือการแจกแจงแบบทวินามและเบต้า มันง่ายในการคำนวณ

หากคุณใช้เวลาสุ่มตัวอย่าง 10 ตัวอย่างของสถานะของโปรแกรมและอยู่ในสภาพที่แน่นอนสำหรับ F = 40% ของเวลาแสดงว่าเป็นเหมือนการทดลองโยนเหรียญด้วยเหรียญที่ไม่เป็นธรรม จำนวนครั้งที่คุณจะเห็นในเงื่อนไขนั้นคือการแจกแจงแบบทวินามที่มีค่าเฉลี่ย 10 * 0.4 = 4 และค่าเบี่ยงเบนมาตรฐานของ sqrt (10 * 0.4 * 0.6) = sqrt (2.4) = 1.55

ในทางกลับกันถ้าคุณนำตัวอย่าง 10 ตัวอย่างมาดูในเงื่อนไขนั้นในตัวอย่าง 4 ตัวนั่นบอกอะไรคุณเกี่ยวกับ F ที่มีขนาดใหญ่เป็นอย่างไร ผลลัพธ์ที่เป็นไปได้คือ 0, 1, 2, 3, 4, ... , 9, 10 นั่นคือความเป็นไปได้ 11 อย่างและความเป็นไปได้ที่คุณเห็น (4) คืออันดับที่ห้า ดังนั้นใช้ตัวเลขสุ่ม 11 ชุด (0,1) แล้วเรียงลำดับ การกระจายตัวของตัวที่ 5 คือการกระจายตัวของ F, การแจกแจงแบบเบต้า โหมดของมันคือ 4/10 ค่าเฉลี่ยของมันคือ 5/11 ความแปรปรวนคือ 5 * 6 / (11 ^ 2 * 12) = 0.021 และค่าเบี่ยงเบนมาตรฐาน = 0.144

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


0

นี่อาจจะง่ายนิดหน่อย แต่G=(V,E)ก็เป็นสิ่งที่ดีที่ควรคำนึงถึง กล่าวอีกนัยหนึ่งกราฟคือชุดของจุดยอดและขอบ กราฟมีประโยชน์มากสำหรับการแสดงสิ่งต่างๆมากมาย

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