Які хороші математичні формули слід знати для програмування? [зачинено]


19

Які деякі дещо поширені математичні формули ви дізналися, які допомогли вам написати кращі алгоритми та стати кращим програмістом?

Приклад: Я дізнався про формулу відстані екклюди: sqrt((x1-x2)^2+(y1-y2)^2)яка допомогла мені зрозуміти, як знайти подібні об’єкти, порівнявши 2 фактори.


2
Я не думаю, що це евклідова формула відстані.
Грег Хьюгілл

@Larry @Greg відредаговано.
GSto

ха-ха, як щодо фібо-послідовності ... добре для бенчмаркінгу
aggietech

1
Дата завершення = (Орієнтовна дата + Кількість
залишених

7
вам може бути цікаво знати, що якщо вам просто потрібно порівняти відстані, ви можете пропустити sqrtкрок. Для щільної внутрішньої петлі це може мати значення.

Відповіді:


16

Знання потужностей 2 зручно, особливо коли мова йде про бітові операції низького рівня.


+1 - Можливість перетворення на бази 2, 16, 10 і 8 є обов'язковим.
mouviciel

2
Я не впевнений у базі-8, але я згоден з перерахунками 2,16 та 10. Ви повинні бути здатні робити це у розумні часові рамки, але не обов'язково миттєво.
інкогніто

Мій один вчитель - це шестигранна тварина. Перетворює в його голові смішні номери, і я був для нього TA протягом року або близько того, клас завжди був вражений, як і я.
Кріс,

Я ненавиджу базу 8 :)

1
Що стосується макросів, перерахунків та бітполів на сучасних мовах, у яких випадках людям потрібно знати сили 2, що є принципово магічними числами ... setsockopt(...SO_KEEPALIVE..)це набагато простіше читати чи писати, ніжsetsockopt(...16...)
JBRWilkinson

15

Булева алгебра вже згадувалася, але я хотів навести кілька практичних прикладів.

Булева алгебра дуже корисна дуже часто, коли ви працюєте зі складними булевими виразами (наприклад, у ifтвердженнях).

Пара корисних виразів і законів:

Поширеність

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

А | (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
Проблема з цим полягає в тому, якщо це фактичні реальні бізнес-правила, оскільки вони мають тенденцію до ЗМІНИ. Якщо це так, вам потрібно реконструювати оригінальний вираз, щоб змінити його, а потім знову оптимізувати його. Підтримувачі, як правило, бурчать.

І саме тут може допомогти карта Карно. Він добре працює лише до 4 булевих прапорів одночасно, але якщо вам потрібно більше - удачі!
Робота

3
+1 за Закон Де Моргана. Я вражений тим, як мало людей, здається, цього вчили і знають, як це застосувати.
Fortyrunner

Ви забули це одне: (P -> Q) <=> (!P | Q). Я використовую його весь час, оскільки дуже мало середовищ пропонують оператора логічних наслідків, це дуже зручна еквівалентність обмежень SQL CHECK.
mu занадто короткий

Закон Карно та Де Моргана - це те, чого ви зазвичай вчите використовувати у класах електротехніки, а не на уроках з комп'ютерної інженерії. Що дивно, адже в останніх можна знайти такі додатки, як практичне використання закону Де Моргана, згаданого вище.
Спікей

9

На мій досвід, математичні формули використовуються для дуже конкретних обчислень, які можуть або не стосуються вашого проекту.

Якщо вам потрібно щось обчислити, зазвичай в бібліотеці або прикладі вихідного коду є функція, яка може обчислити її для вас. Наприклад, функція PMT () Excel, яка обчислює платежі, необхідні для погашення боргу на X% протягом періодів Y. Ви дійсно хочете знати, як він обчислює його, чи достатньо лише зателефонувати на вбудований?

В останні 10 років я не думаю, що мені потрібно було використовувати щось із бібліотеки Math, крім Ceil (), Min () та Max (), що свідчить про те, що хоча комп’ютери були розроблені для вирішення завдань, заснованих на математиці. , сьогодні загальним використанням є прийняття рішень навколо потоку даних.

Візьмемо, наприклад, Facebook, який має величезну кількість коду. Мабуть, десь там є математика, але я підозрюю, що в основному це Crypto API, який, мабуть, є системною бібліотекою. Але доступ до бази даних, рішення про авторизацію, побудова сторінок та маршрутизація інформації, ймовірно, не використовують багато математики.

Так, є ринки, яким потрібно багато математики - фінанси, фізика, інженерія - але в цих галузях вашою основною дисципліною швидше є математика / економіка, фізика, інженерія тощо, тож вашими питаннями будуть: «як я можу писати формула f (x) мовою Y? '

Краще використовувати свій час, IMO, було б вивчити алгоритми (включаючи нотацію Big O) та шаблони дизайну.


1
+1, оскільки це здається розумним твердженням - немає конкретної формули, яку ви повинні знати, але концепція алгоритмічної складності (Big O notation) є дуже важливою.
Майкл Х.

Чимало математики ... Визначає, з якими оголошеннями помилятись.

Я погоджуюсь, що кількість математики, як правило, досить низька, хоча мій досвід не такий вже й низький, як ваш - я в кінцевому підсумку періодично використовую дрібницю в графіці.
Лорен Печтел

7

Не існує формули, яка може зробити вас кращим програмістом.

Навички, пов'язані з математикою, можуть зробити вас кращим програмістом:

  • Науковий метод - математичний / науковий спосіб мислення та вирішення проблем
  • Абстракція - здатність розпізнавати абстракції та закономірності
  • Спадщина - повторне використання існуючих робіт / методів при вирішенні нових проблем
  • Досвід - розуміння набору проблем та рішень

-1, чоловік запитав про корисні МАТЕ ФОРМУЛИ. Я не можу повірити, що ця відповідь була сприйнята взагалі.
Жас


6

Я хотів би згадати серію Тейлора, які дуже корисні для отримання швидких наближень "важчих" функцій. Наприклад, sin(x)приблизно 0 може бути наближено до x-(x*x*x/6).

Загалом, думка про те, що існують розумні способи швидкого наближення речей, замість того, щоб обчислити їх до останньої значної цифри (хоча для елементарних функцій більшість сучасних процесорів містять швидкі жорсткі провідні реалізації, тому використання Тейлора для наближення гріха може бути не такою істотною посилення швидкості).


3

Закони Де Моргана про перетворення булевих "і" і "або" відносно негативів, і кілька пов'язаних з ними більш елементарних примх про булеву логіку (наприклад, подвійне заперечення).


2

Правило три (тип перехресного множення)

+1 для формул базової статистики.

Я бачив багатьох хлопців із труднощами застосувати це просте правило щодо основного коду.


+1 для перехресного множення. У деякому програмному забезпеченні, схильному до цілочисельних проблем із переповненням, перехресне множення використовується для перевірки того, що результати не переповнюються.
rwong

2
Не велике діло. Це має бути закладено в голові випускника середньої школи, який бажає вчитися на КС.
Робота

@Job: У теоретичному світі це правда!
Паготті


2

Закон косинусів , дуже важливий для багатьох геометричних задач,

alt текст

особливо визначення кута.


що таке гамма в тому рівнянні?
Метт Еллен

1
@Matt Ellen: кут нахилу в бік C (IOW, кут між A і B)
Lie Ryan

2
І звичайно, особливий випадок для правильних трикутників:a^2 + b^2 = c^2
Зауважте, що потрібно самостійно - придумайте ім’я

2

Програмування - це дуже широке поле. Формула математики залежить від того, в якій області програмування ви перебуваєте. Якщо ви займаєтесь графікою, ігровим програмуванням, вам потрібно знати більше тригонометрії, геометрії. Програмування ігор можна додатково класифікувати за такими сферами, як фізика, візуалізація, шейдер .. і список продовжується. Отже, якщо ви фахівець з фізичного моделювання, то вам слід знати речі, пов'язані з фізикою.
Якщо ви перебуваєте в безпеці, ви повинні бути експертом з теорії чисел.
Взагалі, ви можете поєднати ці поєднання, і все, що вам цікаво. Навчання ніколи не шкодить.


2

Методи доведення

Найбільше, що я використовував із відносною частотою:

Є більше, і я багато в тому чи іншому моєму періоді використав, але це 3, які я можу пригадати, що використали з першого погляду. Вони також нескінченно корисні, якщо ви можете пам’ятати про свої наміри під час написання одиничних чи інтеграційних тестів.


2

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

Теорему магістра добре знати для програмування. Це дозволяє вирішувати відносини рецидиву, які можуть допомогти вам знайти складність рекурсивних алгоритмів. Це особливо важливо під час написання алгоритму стилю "розділити та перемогти". Грубо кажучи, ви можете використовувати головну теорему, щоб отримати складність, якщо знаєте складність кожного "кроку" та коефіцієнт розгалуження.


1
чому це добре знати для програмування?
Метт Еллен

@MattEllen: Це дозволяє вирішувати рецидивні відносини, які допоможуть вам знайти складність рекурсивних алгоритмів. Це особливо важливо під час написання алгоритму стилю "розділити та перемогти". Грубо кажучи, ви можете використовувати головну теорему, щоб отримати складність, якщо знаєте складність кожного "кроку" та коефіцієнт розгалуження.
Тихон Єлвіс

1
  • алгебра
  • тригонометрія
  • вектор (матричні операції)
  • числення
  • [різні інтерполяції та їх похідні]
  • [поверхні, NURBS]

(ті, що є у брекерах, більше "застосованого" виду)

Дати загальні вказівки важко, оскільки це сильно залежить від сфери, в якій ви знаходитесь. Але вищесказане охоплює основи досить багатьох інженерних ступенів. Зауважте, ці категорії часто перетинаються (тригонометрія + матриця, оп., Обчислення + матриця, і т. Д.).

Я завжди маю підручник з математики поруч. Один з них часто не впевнений, і це допомагає організовувати це.


1

Знання булевої алгебри дуже допомагає. Це утримує вас від написання подібного коду

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

Я не зовсім впевнений, що розумію, як булева алгебра допомагає перешкодити користувачеві писати це? Чи можете ви запропонувати, що там повинен писати користувач? (Я б припустив повернення x <10; але, можливо, помиляюся.)
Кріс,

1
Ви праві - це повинно бути повернення x <10. Думай про це так. Оцінювання (x <10) поверне булевий результат. Потім оператор if розпадається на [якщо x дійсно менше 10], якщо (true) повертає true; або [якщо х більший або дорівнює 10], якщо (помилково) ... інше повернути помилкове;
Ерік Олссон

2
(X <10) може бути відокремлено два бізнес-випадки. За допомогою багатослівної форми ви можете зробити більше, ніж просто повернути значення, що в режимі обслуговування дуже приємно, оскільки ви можете звести зміни до мінімуму

1

Для проблем з оптимізацією добре зрозуміти ймовірність журналу. Наприклад, якщо ви намагаєтеся мінімізувати суму квадратів, це те саме, що максимізувати журнал ймовірності, оскільки (грубо кажучи)

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

Іншими фаворитами у налаштуваннях продуктивності є динаміки Binomial та Beta. Їх дуже просто обчислити.

Якщо ви берете 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)це добре пам’ятати. Іншими словами, графік - це сукупність вершин і ребер. Графіки просто настільки корисні для представлення багатьох речей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.