Các công thức toán học tốt để biết lập trình là gì? [đóng cửa]


19

Một số công thức toán học phổ biến mà bạn đã học giúp bạn viết các thuật toán tốt hơn và trở thành một lập trình viên tốt hơn là gì?

Ví dụ: Tôi đã tìm hiểu về công thức khoảng cách eculian: sqrt((x1-x2)^2+(y1-y2)^2)giúp tôi hiểu cách tìm kiếm các đối tượng bằng cách so sánh 2 yếu tố.


2
Tôi không nghĩ đó là công thức khoảng cách Euclide.
Greg Hewgill

@Larry @Greg chỉnh sửa.
GSto

haha làm thế nào về chuỗi fibo ... tốt cho điểm chuẩn
aggietech

1
Ngày hoàn thành = (Ngày dự kiến ​​+ Số ngày còn lại / 2) ^ (Thời gian tại nơi làm việc / Thời gian tại nhà) * Số lượng pizza miễn phí
Skizz

7
bạn có thể thấy thú vị khi biết rằng nếu bạn chỉ cần so sánh khoảng cách, bạn có thể bỏ qua sqrtbước này. Đối với một vòng lặp bên trong chặt chẽ, điều đó có thể quan trọng.

Câu trả lời:


16

Biết các quyền hạn của 2 là tiện dụng, đặc biệt là khi xử lý các hoạt động bitwise cấp thấp.


+1 - Có thể chuyển đổi sang và từ các cơ sở 2, 16, 10 và 8 là điều bắt buộc.
mouviciel

2
Tôi không chắc chắn về cơ sở 8, nhưng tôi đồng ý với 2,16 và 10 chuyển đổi. Bạn sẽ có khả năng thực hiện nó trong một khung thời gian hợp lý, nhưng không nhất thiết phải ngay lập tức.
Ẩn danh

Một giáo viên của tôi là một động vật hex. Chuyển đổi trong đầu anh ta những con số lố bịch và tôi là một TA cho anh ta trong một năm hoặc lâu hơn, lớp học luôn ấn tượng như tôi
Chris

Tôi ghét cơ sở 8 :)

1
Với các macro, enum và bitfield trong các ngôn ngữ hiện đại, trong trường hợp nào mọi người cần biết sức mạnh của 2, đó là những con số ma thuật cơ bản .. setsockopt(...SO_KEEPALIVE..)dễ đọc hoặc viết hơn rất nhiều so vớisetsockopt(...16...)
JBRWilkinson

15

Đại số Boolean đã được đề cập, nhưng tôi muốn cung cấp một số ví dụ thực tế.

Đại số Boolean rất hữu dụng khi bạn làm việc với các biểu thức boolean phức tạp ( ifví dụ trong các câu lệnh).

Vài biểu thức và luật hữu ích:

Phân phối

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

Một | (B & C) = (A | B) & (A | C)

Vì vậy, lần tới khi bạn vấp phải biểu hiện như vậy:

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

Bạn có thể dễ dàng thu nhỏ nó thành:

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

Tiêu cực và luật De Morgan

! (! A) = A

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

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

Hãy nói rằng bạn có tuyên bố như vậy:

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

và bạn cần xây dựng sự đối lập của nó. Viết:

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

sẽ làm việc, nhưng không tuyệt như thế này:

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

2
Vấn đề với việc này, là nếu đây là quy tắc kinh doanh thực tế thực tế, vì những quy tắc này có xu hướng THAY ĐỔI. Nếu vậy, bạn cần xây dựng lại biểu thức ban đầu để thay đổi nó, và sau đó tối ưu hóa lại. Người bảo trì có xu hướng càu nhàu trong khi làm như vậy.

Và đó là nơi bản đồ Karnaugh có thể giúp đỡ. Nó chỉ hoạt động tốt trên tối đa 4 cờ boolean cùng một lúc, nhưng nếu bạn cần nhiều hơn - chúc may mắn!
Công việc

3
+1 cho Luật của De Morgan. Tôi ngạc nhiên về số ít người dường như đã được dạy nó và biết cách áp dụng nó.
Fortyrunner

Bạn đã quên điều này : (P -> Q) <=> (!P | Q). Tôi sử dụng nó mọi lúc vì rất ít môi trường cung cấp một toán tử hàm ý logic, đây là một sự tương đương rất tiện dụng cho các ràng buộc SQL CHECK.
mu quá ngắn

Luật của Karnaugh và De Morgan là thứ bạn thường được dạy sử dụng trong các lớp kỹ thuật điện nhưng không phải trong các lớp kỹ thuật máy tính. Điều này thật kỳ quặc, bởi vì các ứng dụng có thể được tìm thấy sau này giống như việc sử dụng thực tế luật De Morgan đã đề cập ở trên.
Spoike

9

Theo kinh nghiệm của tôi, các công thức toán học được sử dụng cho các tính toán rất cụ thể, có thể hoặc không thể áp dụng cho dự án của bạn.

Nếu bạn cần tính toán một cái gì đó, thường có một hàm trong thư viện hoặc mã nguồn ví dụ xung quanh có thể tính toán nó cho bạn. Ví dụ: hàm PMT () của Excel, tính toán các khoản thanh toán cần thiết để trả nợ ở mức X% trong khoảng thời gian Y. Bạn có thực sự muốn biết làm thế nào nó tính toán nó, hoặc nó chỉ đủ để gọi một cái tích hợp?

Trong 10 năm qua, tôi không nghĩ rằng mình cần sử dụng bất cứ thứ gì từ thư viện Toán học ngoài Ceil (), Min () và Max (), cho thấy rằng mặc dù máy tính đã được nghĩ ra để giải quyết các vấn đề dựa trên toán học , việc sử dụng phổ biến hiện nay là ra quyết định xung quanh luồng dữ liệu.

Lấy ví dụ, Facebook, nơi có số lượng mã lớn. Có thể có một số Toán học ở đó ở đâu đó, nhưng tôi nghi ngờ chủ yếu trong API Crypto, có lẽ là một thư viện hệ thống. Nhưng truy cập cơ sở dữ liệu, quyết định ủy quyền, xây dựng trang và định tuyến thông tin có thể không sử dụng toàn bộ Toán học.

Vâng, có những thị trường cần rất nhiều môn Toán - tài chính, vật lý, kỹ thuật - nhưng trong các ngành này, ngành học chính của bạn có nhiều khả năng là Toán / Kinh tế, Vật lý, Kỹ thuật, v.v., vì vậy tôi có thể viết công thức f (x) trong ngôn ngữ Y? '

Việc sử dụng tốt hơn thời gian của bạn, IMO, sẽ là điều tra các Thuật toán (bao gồm ký hiệu Big O) và Mẫu thiết kế.


1
+1 vì có vẻ như là một tuyên bố hợp lý - không có công thức cụ thể nào bạn nên biết, nhưng khái niệm về độ phức tạp thuật toán (ký hiệu Big O) là rất quan trọng.
Michael H.

Rất nhiều toán học ... Quyết định quảng cáo nào sẽ làm phiền bạn.

Tôi đồng ý rằng lượng toán học cần thiết thường khá thấp mặc dù kinh nghiệm của tôi không quá thấp như bạn - tôi kết thúc định kỳ bằng cách sử dụng công cụ trig trong đồ họa.
Loren Pechtel

7

Không có công thức nào có thể làm cho bạn trở thành một lập trình viên tốt hơn.

Các kỹ năng liên quan đến toán học có thể giúp bạn trở thành một lập trình viên tốt hơn:

  • Phương pháp khoa học - cách suy nghĩ toán học / khoa học và giải quyết vấn đề
  • Trừu tượng - khả năng nhận ra trừu tượng và các mẫu
  • Kế thừa - tái sử dụng các công việc / phương pháp hiện có để giải quyết các vấn đề mới
  • Kinh nghiệm - hiểu một loạt các vấn đề và giải pháp

-1, người đàn ông hỏi về FORMULAS MATH hữu ích. Tôi không thể tin rằng câu trả lời này đã được nâng cao cả.
Jas


6

Tôi muốn đề cập đến loạt Taylor khá hữu ích để có được xấp xỉ nhanh các chức năng "nặng hơn". Ví dụ sin(x)khoảng 0 có thể được xấp xỉ bằng x-(x*x*x/6).

Nói chung, ý tưởng rằng có những cách thông minh để nhanh chóng ước chừng mọi thứ, thay vì tính toán chúng đến chữ số có nghĩa cuối cùng (mặc dù đối với các chức năng cơ bản, hầu hết các bộ xử lý hiện đại đều chứa các triển khai có dây cứng nhanh, vì vậy sử dụng Taylor để ước tính tội lỗi có thể không đáng kể tăng tốc).


3

Định luật của De Morgan, về việc chuyển đổi Boolean "và" và "hoặc" liên quan đến phủ định, và một vài thông tin cơ bản hơn có liên quan về logic Boolean (chẳng hạn như phủ định kép).


2

Quy tắc ba (loại nhân chéo)

+1 cho các công thức thống kê cơ bản.

Tôi thấy nhiều người gặp khó khăn khi áp dụng quy tắc đơn giản này vào mã cơ bản.


+1 cho phép nhân chéo. Trong một số phần mềm dễ xảy ra sự cố tràn số nguyên, phép nhân chéo được sử dụng để kiểm tra xem kết quả không bị tràn.
rwong

2
Không phải là một thỏa thuận lớn. Điều này nên ăn sâu vào đầu một học sinh tốt nghiệp trung học muốn học CS.
Công việc

@Job: Trong một thế giới lý thuyết, điều này là đúng!
Pagotti


2

Định luật Cosines , rất quan trọng đối với nhiều vấn đề hình học,

văn bản thay thế

đặc biệt là xác định góc.


gamma trong phương trình đó là gì?
Matt Ellen

1
@Matt Ellen: góc của cạnh bên C (IOW, góc giữa A và B)
Lie Ryan

2
Và tất nhiên, trường hợp đặc biệt cho các tam giác vuông:a^2 + b^2 = c^2
Lưu ý đến bản thân - nghĩ về một cái tên

2

Lập trình là một lĩnh vực rất rộng. Công thức toán học phụ thuộc vào lĩnh vực lập trình mà bạn tham gia. Nếu bạn thích đồ họa, lập trình trò chơi, bạn cần biết thêm lượng giác, hình học. Lập trình trò chơi có thể được phân loại thành các lĩnh vực như, vật lý, kết xuất, đổ bóng .. và danh sách tiếp tục. Vì vậy, nếu bạn là một chuyên gia mô phỏng vật lý, thì bạn nên biết những điều liên quan đến Vật lý.
Nếu bạn là người bảo mật, bạn phải là một chuyên gia về Lý thuyết số.
Nói chung, bạn có thể kết hợp những thứ này, và điều mà bạn quan tâm. Học không bao giờ đau.


2

Phương pháp chứng minh

Đáng chú ý nhất là những cái tôi đã sử dụng với tần suất tương đối:

Có nhiều hơn nữa, và tôi đã sử dụng nhiều trong số chúng ở điểm này hay điểm khác, nhưng đây là 3 cái mà tôi có thể nhớ lại đã sử dụng trong nháy mắt. Chúng cũng vô cùng hữu ích nếu bạn có thể ghi nhớ ý định của chúng khi viết bài kiểm tra đơn vị hoặc tích hợp.


2

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

Định lý thạc sĩ là tốt để biết lập trình. Nó cho phép bạn giải quyết các mối quan hệ lặp lại có thể giúp bạn tìm thấy sự phức tạp của các thuật toán đệ quy. Điều này đặc biệt quan trọng khi viết thuật toán kiểu "phân chia và chinh phục". Nói một cách đơn giản, bạn có thể sử dụng định lý chính để có được độ phức tạp nếu bạn biết độ phức tạp của từng "bước" và hệ số phân nhánh.


1
Tại sao nó tốt để biết lập trình?
Matt Ellen

@MattEllen: Nó cho phép bạn giải quyết các mối quan hệ lặp lại có thể giúp bạn tìm thấy sự phức tạp của các thuật toán đệ quy. Điều này đặc biệt quan trọng khi viết thuật toán kiểu "phân chia và chinh phục". Nói một cách đơn giản, bạn có thể sử dụng định lý chính để có được độ phức tạp nếu bạn biết độ phức tạp của từng "bước" và hệ số phân nhánh.
Tikhon Jelvis

1
  • đại số học
  • lượng giác
  • vectơ (ma trận hoạt động)
  • tính toán
  • [nội suy khác nhau và các dẫn xuất của chúng]
  • [bề mặt, NURBS]

(những người trong nước lợ là một loại "áp dụng")

Thật khó để đưa ra những định hướng chung, vì nó phụ thuộc rất nhiều vào lĩnh vực mà bạn tham gia. Nhưng những điều trên bao gồm những điều cơ bản của khá nhiều bằng kỹ sư. Xin lưu ý các bạn, các danh mục này thường trùng nhau (lượng giác + ma trận ops., Tính toán + ma trận ops, v.v.).

Tôi luôn có một cuốn sổ tay toán học gần kề. Một người thường không chắc chắn về điều gì đó, và nó giúp trình bày nó một cách có tổ chức.


1

Biết đại số boolean giúp rất nhiều. Nó giữ cho bạn khỏi viết mã như

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

Tôi không chắc chắn tôi hiểu làm thế nào đại số boolean giúp ngăn người dùng viết điều đó? Bạn có thể đề xuất những gì người dùng nên viết ở đó? (Tôi sẽ giả sử trả về x <10; nhưng có thể bị nhầm.)
Chris

1
Bạn đã đúng - nên trả về x <10. Nghĩ theo cách này. Đánh giá (x <10) sẽ trả về kết quả Boolean. Câu lệnh if sau đó được chia thành [if x thực sự nhỏ hơn 10] nếu (true) trả về true; hoặc [if x lớn hơn hoặc bằng 10] if (false) ... khác trả về false;
Eric Olsson

2
(X <10) có thể tách hai trường hợp kinh doanh. Với hình thức dài dòng, bạn có thể làm nhiều hơn là chỉ trả về các giá trị, trong chế độ bảo trì rất đẹp, vì bạn có thể giữ các thay đổi ở mức tối thiểu

1

Đối với các vấn đề tối ưu hóa, thật tốt để hiểu khả năng đăng nhập. Ví dụ: nếu bạn đang cố gắng tối thiểu hóa một tổng bình phương, thì đó cũng giống như tối đa hóa nhật ký của khả năng, bởi vì (nói đại khái)

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

Các mục yêu thích khác trong lĩnh vực điều chỉnh hiệu suất là các bản phân phối Binomial và Beta. Họ rất đơn giản để tính toán.

Nếu bạn lấy 10 mẫu thời gian ngẫu nhiên về trạng thái của chương trình và nó ở trong một điều kiện nhất định cho F = 40% thời gian, thì nó giống như một thử nghiệm tung đồng xu với một đồng xu không công bằng. Số lần bạn sẽ thấy nó trong điều kiện đó là phân phối nhị thức với giá trị trung bình 10 * 0,4 = 4 và độ lệch chuẩn của sqrt (10 * 0,4 * 0,6) = sqrt (2.4) = 1,55.

Mặt khác, nếu bạn lấy 10 mẫu và tình cờ nhìn thấy nó trong điều kiện đó trên 4 mẫu, điều đó cho bạn biết F lớn như thế nào? Các kết quả có thể xảy ra là 0, 1, 2, 3, 4, ..., 9, 10. Đó là 11 khả năng và khả năng bạn thấy (4) là khả năng thứ 5. Vì vậy, lấy 11 số ngẫu nhiên (0,1) và sắp xếp chúng. Phân phối của thứ 5 là phân phối F, phân phối Beta. Chế độ của nó là 4/10. Ý nghĩa của nó là 5/11. Phương sai của nó là 5 * 6 / (11 ^ 2 * 12) = 0,021 và độ lệch chuẩn = 0,144.

Nhiều người nghĩ rằng cần một số lượng lớn mẫu để xác định các vấn đề về hiệu suất phần mềm và tránh tìm ra sai. Những phân phối này cho thấy một số lượng nhỏ mẫu có thể tiết lộ rất nhiều về chi phí của chúng.


0

Điều này có thể hơi đơn giản, nhưng G=(V,E)là một điều tốt để ghi nhớ. Nói cách khác, đồ thị là một tập hợp các đỉnh và cạnh. Đồ thị chỉ rất hữu ích để đại diện cho nhiều thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.