Програмування чи інформатика взагалі стосується алгоритмів?


40

Як студент, мені здається, що для престижних компаній (таких як Google, Facebook, Microsoft, ...) все частіше ставлять запитання щодо алгоритмів у своїх тестах та інтерв'ю. Кілька стартапів, до яких я звернувся, також запитали про алгоритми. Цікаво, чи вільне володіння алгоритмами є найважливішим для розробника програмного забезпечення в цих компаніях?

Якщо відповідь "так", то який найкращий метод або ресурси для того, щоб навчитися та практикувати алгоритми ефективно? Я не можу зацікавити вирішенням, здавалося б, занадто складних проблем, знайдених у більшості підручників чи веб-сайтів. Хоча легко розуміти основні алгоритми (наприклад, кваксорт, бульбашка, ...), мені здається, що надзвичайно важко запам'ятати та повторно використовувати їх.

Дякую.

P / S: Якщо ви запитаєте мене, що мені подобається, це створення хороших програмних засобів для інноваційного вирішення проблем користувачів. Я вважаю, що це не обов'язково означає, що програмне забезпечення повинно бути дуже складним.


26
Будь-яка ідея, наскільки складно Google дозволити вам шукати весь Інтернет за допомогою текстового поля та кнопки?
JeffO

21
@JeffO Я більше навіть не використовую цю кнопку ;-)
maple_shaft

1
Якщо Google полегшує, всі інші пошукові сайти взагалі не потребуватимуть коду.
JeffO

Я подумав, що питання стосуватиметься роботи комп'ютерів, як, як працює процесор, як працює оперативна пам’ять, як працює Wi-Fi і т. Д. Ці досить цікаві питання, як і раніше піддаються досить багато досліджень. Я все ще знаходжу апаратне забезпечення приголомшливішим, ніж усі програми, що програмують вундеркінди в Java або PHP.
jokoon

2
Справа не в алгоритмах, але вони дійсно лежать в основі CS. Але в програмуванні є набагато більше, ніж просто алгоритми та логіка (наприклад, підтримка коду не вимагатиме лише знань алгоритмів).
haylem

Відповіді:


44

Алгоритми зрозумілі

Ось прекрасна річ щодо алгоритмів: Проблемний простір, з яким вони займаються, чітко визначений, тобто ваші вимоги не тільки фактично відомі , але зазвичай навіть формалізовані так, як показники якості рішення.

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

Алгоритми - це ефективний фільтр

Сучасна проблема галузі (та освіти) - низька середня якість випускників. Це було проілюстровано тестом FizzBuzz , який є:

Напишіть програму, яка пройде через числа від 1 до 100 і надрукує "fizz", якщо число ділиться на 3, "buzz", якщо воно ділиться на 5, і саме число, якщо воно не ділиться на жодне.

Мабуть, більшість усіх випускників Comp Sci не вдається вирішити цю проблему. Зверніть увагу, що це алгоритмічне питання, хоча, звичайно, бентежно просте. З огляду на це, якщо ви знайдете когось, хто може вирішити проблеми з Google Code Jam або Project Euler, ви вже насолоджуєтеся crème-de-la-crème.

Алгоритми - це крихітна частина розробки програмного забезпечення

Правда полягає в тому, що як тільки ви працюєте в галузі, ви не будете використовувати свої навички алгоритму більше 1% часу.

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

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

Алгоритми є критичними

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

Що насправді важливо - це відчути складність обчислювальної техніки та як її знизити, як я також пояснив у відповідь на подібне запитання . Або спеціалізуватися на речах, де це просто не важливо, як, наприклад, розробка графічного інтерфейсу, але знову майже всі його ненавидять ... не просто так!


5
+1 за дуже вичерпну та розумну відповідь. Також сумно, наскільки ефективним є фільтр FizzBuzz. Немає жодного приводу для того, щоб не зробити цього.
Адам Кросленд

4
Я подумав, що ви повинні друкувати, fizzbuzzякщо число ділиться на обидва, і багато хто прослизає, тому що вам потрібно замовити ретельно перевіряти модуль.
Матьє М.

1
1% може бути трохи зависоким
конопля

1
@MatthieuM: друк обох притаманний тому, як формулюється вимога. Відсутнє це означає, що ви ретельно не перевіряли вимоги; Тепер, що мені здається цікавим, це те, що воно не говорить про те, що ви повинні їх друкувати в якомусь конкретному порядку чи навіть послідовно в тому ж порядку ...
jmoreno

1
@ back2dos: так, але робити це у випадковому порядку звучить як веселіше ... зауважте, що вимога, наведена у цій відповіді, не згадує рядки, а лише друк . Якщо вам здадуть тест на FizzBuzz, можливо, варто зазначити, що в ньому багато невстановлених припущень (тоді, знову ж таки, це може просто вас намалювати як розумний).
jmoreno

30

Взагалі програмування як завдання - це не алгоритми. Ви можете витратити роки на програмування програм CRUD, не вимагаючи глибоких алгоритмічних навичок.

Програмування як робота полягає в наступному:

  1. Зв'язок:

    • Ваш вихідний код - це засіб донести свої ідеї до однолітків. Якщо ніхто не може прочитати / зрозуміти ваш код, він нічого не вартий.

    • Самотній розробник, який не спілкується з будь-яким іншим розробником, ймовірно, почне робити помилки в коді і вважає, що його власний підхід є єдино прийнятним.

    • Ви повинні знати, як спілкуватися із зацікавленими сторонами, відділом QA, користувачами, візуальними дизайнерами, DBA тощо.

    • Як досвідчений розробник, ви повинні навчити менш досвідчених колег, які бажають вдосконалити свої навички.

  2. Знання правильних інструментів: контроль версій, система відстеження помилок, IDE, яка мова краще підходить для конкретного завдання та чому, як використовувати аналіз коду тощо.

  3. Широкі знання та культура: що таке функціональні мови? Як комп'ютери інтерпретують код? Чому LOC - це безглуздий захід? тощо.

  4. Глибоке знання мови, якою ви працюєте.

  5. Алгоритми.

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


12
-1: "Програми CRUD" - це алгоритми. Вони просто (загалом) прості. Немає «благородного сенсу».
S.Lott

2
а вихідний код - ваш єдиний канал зв'язку з комп’ютером, який робить саме те , що ви йому робите (і майже ніколи не хочете, що це робити)
храповик-чудак

5
Дивовижно, наскільки хороший ринок очищення програм CRUDdy, інженерні команди яких ігнорували (або ніколи не вивчали) основи алгоритмів.
JasonTrue

2
@ S.Lott: "Програми CRUD є алгоритмами" є аналогом "Я - Америка". ;)
Джим Г.

1
@JimG: Як каже Стівен Колберт "Я - Америка, і ти можеш". Програми CRUD містять, базуються на, включають, реалізують, реалізують, втілюють, відображають алгоритми. Ви лише скаржилися, не підказуючи конкретного прийменника. Що зробило б тебе щасливішим?
S.Lott

16

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

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

Щодо того, як практикувати розробку алгоритмів, Стів Йегге рекомендує Посібник з дизайну алгоритму Скієни у своєму чудовому посібнику з інтерв'ю як програміста .


4
+1: мови програмування, фреймворки, операційна система, редактори, набори інструментів, всі вони "ідуть-і-ідуть", але знання ефективного вирішення проблем має все відношення до знання основ структури даних та алгоритмів. Ці речі залишаються з нами завжди.
Адам Кросленд

"Що стосується того, як практикувати розробку алгоритмів, Стів Йегге рекомендує керівництво з дизайну алгоритму Скієни у своєму чудовому посібнику з інтерв'ю як програміста". Вибачте, але це може не застосовуватись до людини, яка задала це запитання, оскільки він, здається, студент випускника. Google / MS перейшли від Skiena (для студентів вищих навчальних закладів), щоб задати питання, що з’явились на міжнародних конкурсах колегіального програмування. (Це я точно знаю з анекдотичного досвіду). Книга Скієни досі використовується - але в основному для кандидатів нижчого рівня.
користувач396089

Що стосується питань, що з’являються на змаганнях з програмування - вас дуже сильно розмовляє, якщо ви ще не бачили цього питання (якщо ваш IQ також не знаходиться на 3 SD від звичайного)
user396089

11

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

  • Розробники, які не можуть швидко вивчити та адаптуватися до нових доменів

  • Розробники, які не можуть змістовно взаємодіяти з клієнтами або зацікавленими сторонами

  • Розробники, які не можуть вдруге здогадуватися і ставити під сумнів неправильні або погано продумані вимоги бізнесу

  • Розробники, які не розуміють, як ретельно перевірити свій код та функції

  • Розробники, які не можуть вчасно надати значущих оцінок

  • Розробники, які не можуть створити чітку і стисну документацію

  • Розробники, які не можуть самостійно розпочати або взяти на себе відповідальність за ситуацію

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

Реальний бізнес хоча і не бореться зі складнощами інформатики, але бореться зі складнощами людства. Проблема полягає в тому, що НАДАЛЬНО важко перевірити вищезазначені якості. Більшу частину часу вам доводиться судити людей за цими якостями, виходячи з вашої реакції кишечника. Це важко, якщо у вас немає хороших навичок та інтуїції у людей, набагато простіше перевірити знання алгоритму.


+1 Регулярним компаніям, які не нагадують гугл, потрібні люди з хорошими діловими навичками, і насамперед у розумінні способів винаходити / застосовувати / керувати / змінювати процеси. Не помилка, що компанії, схожі на Google, не вилупили рух Agile, оскільки інформатика не стосується вирішення бізнес-проблем.
S.Robins

10

Я особисто бачу "стандартні" алгоритми та структури даних як частину словника програміста. І багато практичних проблем, з якими ви стикаєтесь як програміст, часто мають рішення, яке (принаймні частково) виражається в цій лексиці.

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

"Я не можу зацікавити вирішенням, здавалося б, занадто складних проблем, знайдених у більшості підручників чи веб-сайтів"

"Мені здається, що надзвичайно важко запам'ятати та повторно їх використовувати"

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


+1 для структур даних. Вони - друга половина алгоритмічної монети.
Спенсер Ратбун

9

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

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


1
+1 Ідеальна відповідь! Простіше перевірити знання алгоритму.
maple_shaft

"ваші алгоритми" - я самоучка. Чи є десь джерело чи список, де зазначено, які ці загальні алгоритми повинні знати кожен програміст? Я хотів би прочитати їх. Дякую!
Омінус

2
@Ominus Хоча загального консенсусу щодо алгоритмів "джентльмена" немає, у більшості випадків він включатиме пошук, сортування, переміщення структур даних, у яких відсутня просторова безперервність (пов'язані списки, бінарні дерева тощо), і рудиментарний (неправильно) додатки рекурсії (рекурсивна факториал, послідовність Фібоначчі тощо)
dasblinkenlight

@Ominus - Я теж самоук, але думаю "Вступ до алгоритмів" - CLRS - це хороший спосіб ознайомитись із цим полем. Книга Скієни "Посібник з дизайну алгоритму" також хороша.
Тод

5

Так, програмування переважно стосується алгоритмів.

Але, можливо, не в тому сенсі, що ти думаєш.

У мене складається враження, що всі ми використовуємо різні визначення алгоритму. Якщо чесно, на це питання важко відповісти, оскільки алгоритм - невиразний термін. Я використаю визначення Вікіпедії, щоб відповісти на це питання:

Набір правил, який точно визначає послідовність операцій.

Це серце і душа програмування. Коли ви пишете будь-який код, ви просто реалізуєте алгоритм. Якщо ви пишете деякі програми CRUD, ви реалізуєте простий алгоритм. Вміти придумати алгоритм для вирішення проблеми - це те, що програмування. Решта - лише деталі.

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


З іншого боку, в математиці серце і душа можуть бути алгоритмами, проте для програмування це щось інше. Ви можете писати програмне забезпечення, не потребуючи алгоритмів як такого (можливо, не добре програмне забезпечення), але ви не можете писати програмне забезпечення без логіки та абстрактного мислення. Однак на самому серці справа в тому, щоб вирішити проблеми. Пошук рішення є алгоритмічним процесом, але саме рішення не обов'язково є алгоритмом.
S.Robins

4

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

Те, що підтверджує чітке розуміння алгоритмів, - це доказ потенційному роботодавцю, що ви вміло вирішуєте проблеми. Це насправді не хороший показник (ІМО) хорошого працівника, але деякі роботодавці використовують це для скринінгу. Якщо ви подаєте заявку на посаду, яка вимагає ступінь випускника, від вас очікується, що ви будете мати більш жорстку основу в алгоритмах.

Що (ІМО) надзвичайно корисно на практиці - це не запам'ятовування конкретних алгоритмів, а через розуміння того, як працюють деякі алгоритми, є цей маленький самородок у самому розумі, де ви скажете "Я це бачив раніше" або "Я знаю, що я можна зробити це краще ", що дасть трохи досліджень щодо вирішення вашої проблеми.


+1 для розмови про штат найму для студентів випускних класів. Деякі компанії набагато метушливіші при прийнятті на роботу студентів, ніж студенти. Але, щоб бути справедливим до них, студенти також отримують більшу оплату і зазвичай набираються на вищому рівні всередині країни.
користувач396089

1

Я завжди думаю, що програмування більше керується даними, ніж алгоритми .. але тоді, яке використання використовують дані, якщо ви не робите з цим справи ... всі ці маніпуляції - це алгоритми. Так що насправді так, програмування майже повністю засноване на алгоритмі.

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


1

Тільки програмісти, які працюють у цих компаніях, дійсно можуть відповісти на ваше запитання. Види алгоритмів, які розглядаються в "Вступі до алгоритмів", ймовірно, зіграли частку в 0,01% мого життя програмування за останні 25 років. Коли мені потрібна структура даних або сортування, зазвичай бібліотеки або рамки, що постачаються, мають те, що мені потрібно. Коли мені потрібен надшвидкий FFT, я знаходжу щось на зразок Intel Math lib, а не пишу сам. Однак я можу, як те, що вони роблять в Google, відрізняється від того, що я робив у своїй кар’єрі. Книга Скієни "Посібник з розробки алгоритмів" була привабливою для історії, яку він розповідає. Ви можете сказати, що він використовує алгоритми у своїй роботі.

З мого досвіду як незалежного консультанта з програмування, успіх досягнуто з трьох речей: 1. Ефективна комунікація з клієнтами 2. Написання коду, який працює. 3. Управління складністю

Виконувати лише цифри 1 і 2 недостатньо. Якщо код не підтримується (хтось, крім програміста, який його написав, він приречений.

Число 3 - це найскладніша навичка програмування. Це вимагає введення думки в архітектуру, дизайн та кодування. Він вимагає освоїти рефакторинг. Це вимагає розуміння принципів твердого / сухих. Якби мені довелося найняти програміста, який читав «Вступ до алгоритмів» і присвятив себе оволодінню ним, або того, хто читав «Прагматичний програміст» і присвятив себе таким, що він є, я б найняв останнього кожного разу. (Не те, що вони мають взаємно виключати).


1

Так.

Інформатика - це переважно алгоритми (у відсотках).

Немає.

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

Запитайте у зайнятого професора великого університету комп'ютерних наук, що найважливіше розуміти в програмуванні, і вони, ймовірно, скажуть вам "алгоритми та структури даних"

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

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


1

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


1

У галузі інформатики, які поняття, які ви дізнаєтесь, не принесуть користі, доки ви не покажете це. Проблема викликає головне питання, яку потрібно вирішити, тому алгоритм - це коротке планування того, як проблема буде вирішена в цілому. Тому це викликає велике занепокоєння у світі інформатики.

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

Автомати

Конструкція електроустановок. Алгоритм перетворення недетермінованого автомата в детермінований автомат. Алгоритм Тодда-Коксетера. Порядок генерації косет.

Штучний інтелект

Альфа-бета. Альфа-макс плюс бета-хв. Широко використовується в настільних іграх. Мурашині алгоритми. Оптимізація колонії мурашок - це набір алгоритмів, натхненних поведінкою мурашок для вирішення проблеми, пошуку найкращого шляху між двома локаціями. DE (диференціальна еволюція). Розв’яжіть задачу полінома Чебішева на примірку. Напівконтрольне визнання саркастичних вироків в оглядах Інтернет-продуктів. Алгоритм, який розпізнає сакразми або іронію у твіті або в онлайн-документі. Такий алгоритм буде важливим і для програмування гуманоїдних роботів.

Комп'ютерне бачення

Епітомія. Представити зображення чи відеоролик меншим розміром. Підрахунок об'єктів на зображенні . Використовує алгоритм маркування підключеного компонента, щоб спочатку позначити кожен об'єкт, а потім підрахувати об'єкти. Алгоритм O'Carroll. Завдяки математичному перетворенню зору комах цей алгоритм оцінює, як обійти уникнення предметів.

Генетичні алгоритми

Вони використовують три оператора. вибір (вибрати рішення), відтворення (використовувати обрані рішення для побудови інших), заміна (якщо краще замінити рішення).

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

Нейронні мережі

Сітка Хопфілда Повторна штучна нейронна мережа, яка служить системою пам'яті, адресованої вмістом, з бінарними пороговими одиницями. Вони сходяться до стабільного стану. Зворотне розповсюдження. Керована методика навчання, що використовується для тренування штучних нейронних мереж. Карта самоорганізації (карта Кохонена). Нейронні мережі, що навчаються, використовуючи непідвладне навчання для створення низькомірного (2D, 3D) подання навчальних зразків. Підходить для візуалізації високомірних даних.

Біоінформатика

Needleman-Wunsch. Виконує глобальне вирівнювання на двох послідовностях для білкових або нуклеотидних послідовностей. Сміт-Уотерман. Варіація Ігольця-Вунша.

Стиснення

Алгоритми стиснення без втрат

Перетворення Берроу-Уілера. Попередня обробка корисна для поліпшення стиснення без втрат. Спуску. Стиснення даних, що використовується ZIP. Кодування Delta. Допомога стисненню даних, в яких послідовні дані часто трапляються. Поступове кодування. Кодування Delta застосовується для послідовностей рядків. LZW. (Лемпель-Зів-Велч). Наступник LZ78. Створює таблицю перекладу з даних для стиснення. Використовується у графічному форматі GIF. LZ77 і 78. Основа подальших варіацій LZ (LZW, LZSS, ...). Вони обидва словникові кодери. LZMA. Скорочення до ланцюга-Алгоритм Лемпеля-Жива-Маркова. LZO. Алгоритм стиснення даних, орієнтований на швидкість. PPM(Прогнозування шляхом часткового узгодження). Адаптивна методика стиснення статистичних даних на основі контекстного моделювання та прогнозування. Кодування Шеннона-Фано Побудовує префіксні коди на основі набору символів та їх ймовірностей. Урізаний двійковий. Ентопічне кодування, як правило, використовується для рівномірного розподілу ймовірностей з кінцевим алфавітом. Поліпшення бінарного кодування. Кодування за довжиною виконання. Первинне стиснення, яке замінює послідовність одного і того ж коду числом випадків. Секвітур. Додатковий граматичний висновок про рядок. EZW (вбудована вейвлет Zerotree). Прогресивне кодування для стиснення зображення в бітовий потік із збільшенням точності. Можливо, стиснення втрат також має кращі результати.

Ентропійне кодування Схема кодування, яка присвоює коди символам, щоб відповідати довжині коду імовірності символів.

Кодування Хаффмана. Просте стиснення без втрат, використовуючи переваги відносних частот символів. Адаптивне кодування Хаффмана. Техніка адаптивного кодування, заснована на кодуванні Хаффмана. Арифметичне кодування. Розширене ентропійне кодування. Кодування діапазону Те саме, що арифметичне кодування, але розглядається дещо по-іншому. Унарне кодування. Код, який представляє число n з n, з наступним нулем. Дельта Іллі, гамма, кодування омега. Універсальний код, що кодує натуральні числа. Кодування Фібоначчі Універсальний код, який кодує додатні цілі числа у двійкові кодові слова. Кодування Голомба. Форма кодування ентропії, яка є оптимальною для алфавітів після геометричних розподілів. Кодування рису Форма кодування ентропії, яка є оптимальною для алфавітів після геометричних розподілів.

Алгоритми стиснення втрат

Лінійне прогностичне кодування. Стиснення втрат шляхом подання спектральної оболонки цифрового сигналу мови у стисненій формі. Алгоритм закону. Стандартний алгоритм порівняння. Алгоритм му-закону. Стандартний алгоритм стиснення або порівняння аналогового сигналу. Фрактальна компресія. Метод, що використовується для стискання зображень за допомогою фракталів. Перетворення кодування. Тип стиснення даних для таких даних, як звукові сигнали чи фотознімки. Квантування вектор Техніка часто використовується при стисненні втрат даних. Стиснення вейвлетів. Форма стиснення даних добре підходить для стиснення зображень та аудіо.

Криптографія

Секретний ключ (симетричне шифрування)

Використовуйте секретний ключ (або пару безпосередньо пов’язаних ключів) і для розшифрування, і для шифрування.

Розширений стандарт шифрування (AES) , також відомий як Rijndael. Сипуха. Розроблений Шнейє як алгоритм загального призначення, призначений як заміна старіння DE. Стандарт шифрування даних (DES) , раніше алгоритм DE. IDEA (Міжнародний алгоритм шифрування даних) . Раніше IPES (вдосконалений PES), ще одна заміна DES. Використовується PGP (досить хороша конфіденційність). Виконує перетворення даних, розділених на блоки, за допомогою ключа. RC4 або ARC4. Поточний шифр широко використовується в таких протоколах, як SSL для інтернет-трафіку та WEP для бездротових мереж. Алгоритм крихітного шифрування. Простий в реалізації алгоритм блочного шифрування за допомогою деяких формул. PES (пропонований стандарт шифрування). Старіша назва для IDEA.

Відкритий ключ (асиметричне шифрування)

Використовуйте пару ключів, позначених як відкритий та приватний ключ. Відкритий ключ шифрує повідомлення, лише приватний ключ дозволяє розшифрувати його.

DSA (алгоритм цифрового підпису). Створення ключів з простими та випадковими числами. Користувався американськими агентствами, а тепер є загальнодоступним доступом. ElGamal. На основі Diffie-Hellman, що використовується програмним забезпеченням GNU Privacy Guard, PGP та іншими криптографічними системами. RSA (Rivest, Shamir, Adleman). Широко використовується в протоколах електронної комерції. Використовуйте прості числа. Обмін ключами Diffie-Hellman (Merkle) (або експоненціальний обмін ключами). Метод та алгоритм для обміну секретом по незахищеному каналу зв'язку. Використовується RSA. NTRUEкрипт. Скористайтеся кільцями многочленів із множенням згортки.

Функції перебору повідомлень

Дайджест повідомлень - це код, отриманий в результаті шифрування рядка або даних будь-якої довжини, оброблених хеш-функцією.

MD5. Використовується для перевірки ISO-зображень компакт-дисків або DVD-дисків. RIPEMD (Дайджест повідомлення оцінювальних примітивів за RACE). На основі принципів MD4 та подібних до SHA-1. SHA-1 (Алгоритм безпечного хешу 1). Найчастіше використовується набір SHA пов'язаних криптографічних хеш-функцій. Було розроблено агентством АНБ. HMAC. аутентифікація повідомлення з ключем-хеш Тигр (TTH). Зазвичай використовується в тигрових хешах дерев.

Криптографічні з використанням псевдовипадкових чисел Див. Генератори випадкових чисел

Методи криптографії

Таємний обмін, Таємне розщеплення, Розщеплення ключів, M з N алгоритмів.

Таємна схема обміну Шаміром. Це формула, заснована на поліноміальній інтерполяції. Таємна схема обміну Блеклі. Має геометричну природу, секрет - точка в m-мірному просторі.

Інші методи та дешифрування

Сума підмножини З огляду на набір цілих чисел, чи є підмножина сумою рівним нулю? Використовується в криптографії. Алгоритм Шор. Квантовий алгоритм здатний розшифрувати код на основі асиметричних функцій, таких як RSA.

Геометрія

Упаковка подарунків Визначення опуклого корпусу множини точок. Відстань Гілберта-Джонсона-Керті. Визначення найменшої відстані між двома опуклими фігурами. Грейм сканування. Визначення опуклого корпусу безлічі точок у площині. Перетин відрізка лінії. Виявлення, чи перетинаються лінії з алгоритмом розгортки ліній. Точка в багатокутнику. Тестує, чи лежить дана точка в межах даної. Перехрестя променя / площини. * Перетин лінії / трикутника. * Конкретний випадок перетину променя / площини. Полігонізація неявних поверхонь. Орієнтовна неявна поверхня з полігональним поданням. Тріангуляція.Метод оцінки відстані до точки від кутів до інших точок, відстань яких відома.

Графіки 3D технології відстеження поверхні. Обробляйте додавання зображень на стіни у відеоролик, при цьому враховуються приховані поверхні. Беллман-Форд. Обчислює найкоротші шляхи у зваженому графіку (де деякі ваги краю можуть бути негативними). Алгоритм Дейкстри. Обчислює найкоротші шляхи в графіку з негативними вагами краю. Методи обурення. Алгоритм, який обчислює локально найкоротші шляхи в графі. Флойд-Варшалл. Розв'язує задачу всіх пар про найкоротший шлях у зваженому, спрямованому графіку. Флойд-пошук циклу. Знаходить цикли в ітераціях. Джонсон. Алгоритм найкоротшого шляху всіх пар у розрізненому зваженому графіку. Крускал.Знаходить мінімальне прольотове дерево для графіка. Прим. Знаходить мінімальне прольотове дерево для графіка. Також називається алгоритмом DJP, Jarník або Prim – Jarník. * Boruvka. * Знаходить мінімальне прольотове дерево для графіка. Форд-Фулкерсон. Обчислює максимальний потік у графіку. Едмондс-Карп. Впровадження Ford-Fulkerson. Неблокуючий мінімальний натягуючий вимикач. Для телефонної станції. Вудхаус-Шарп. Знаходить мінімальне прольотове дерево для графіка. Весна заснована. Алгоритм малювання графіка. Угорська. Алгоритм пошуку ідеального узгодження. Алгоритм фарбування. Алгоритм фарбування графіків Найближчий сусід.Знайти найближчого сусіда. Топологічний сорт. Сортуйте спрямований ациклічний графік таким чином, щоб кожен вузол вийшов перед усіма вузлами, до яких він має ребра (відповідно до вказівок). Офлайн алгоритм найменш поширених предків Тарджана. Обчисліть найнижчі загальні предки для пар вузлів на дереві.

Графіка

Лінійний алгоритм Брезена. Використовує змінні рішення для накреслення прямої між двома вказаними точками. Пейзаж Намалюйте 3D-пейзаж. * Алгоритм рядка DDA. * Використовує математику з плаваючою комою для побудови графіків прямої лінії між двома вказаними точками. Затоплення. Заповнює з’єднану область кольором. Відновлення зображення Відновлення фотографії, поліпшення зображень. Лінійний алгоритм Сяолінь Ву. Лінія антиалійного. Алгоритм роботи художника. Виявляє видимі частини тривимірної декорації. Проміння Рея. Реалістичне зображення. Затінення фонгом. Модель освітлення та метод інтерполяції в комп'ютерній графіці 3D. Затінення Гуру.Моделюйте різні ефекти світла та кольору по всій поверхні 3D-об’єкта. Відображення сканінгу. Побудовує зображення, переміщуючи уявну лінію. Глобальне освітлення. Розглядає пряме освітлення та відбиття від інших предметів. Інтерполяція. Побудова нових точок даних, таких як цифровий зум. Ресинтезатор. Видаліть об’єкт на фотографії та відновіть фон, що використовується Photoshop та The Gimp. Підручник з ресинтезатором. Алгоритм перехоплення нахилу. Це реалізація формули перехоплення нахилу для нанесення лінії. Інтерполяція сплайну. Зменшує помилку із явищем Рунге. 3D поверхнева технологія відстеження. Додавання зображень або vidéo на стінах у відео, приховані поверхні враховуються.

Списки, масиви та дерева

Пошук

Пошук словника. Див. Прогнозний пошук. Алгоритм вибору Знаходить найбільш великий елемент у списку. Алгоритм двійкового пошуку. Розташовує елемент у відсортованому списку. Перший пошук. Переміщення рівня графіка за рівнем. Поглиблений пошук. Перетинає графік за галуззю. Найкращий пошук. Переміщає графік у порядку, ймовірно важливому, використовуючи чергу пріоритету. Дерево пошуку. * Особливий випадок краще першого пошуку , який використовує евристичні методи для підвищення швидкості. Пошук уніфікованої вартості. Пошук дерев, який знаходить маршрут з найнижчою вартістю, коли вартість варіюється. Прогнозний пошук.Бінарний, як пошук, який визначає величину пошукового терміна порівняно з високими та низькими значеннями в пошуку. Таблиця хешу Пов’яжіть ключі до предметів у несортованій колекції, щоб отримати їх у лінійний час. Інтерпольований пошук. Див. Прогнозний пошук.

Сортування

Бінарний сорт дерева. Сорт двійкового дерева, поступовий, подібний до сортування вставки. Богосор. Неефективний випадковий вид настільної картки. Сорт бульбашки. Для кожної пари індексів поміняйте місцями, якщо вони вийшли з ладу. Сорт відра. Розділіть список по відрах і сортуйте їх окремо. Узагальнює сорти голубів. Сорт коктейлю (або двонаправлений міхур, шейкер, пульсація, човник, щасливий годинник). Варіанти сортування бульбашок, які сортуються в обох напрямках, кожен проходить через список. Гребінець сортування. Ефективна зміна сортування бульбашок, що виключає "черепашки", невеликі значення в кінці списку та використовує прогалини серед значень. Підрахунок сортування.Він використовує діапазон чисел у списку A для створення масиву B такої довжини. Індекси у В використовуються для підрахунку кількості елементів у А, які мають значення менше i. Gnome сорт. Подібно до сортування вставки, за винятком того, що переміщення елемента на його належне місце здійснюється за допомогою серії замінів, як у сортуванні бульбашок. Гіпсорт. Перетворіть список у купу, продовжуйте видаляти найбільший елемент із купи та додавати його до кінця списку. Сортування вставки. Визначте, куди належить поточний елемент у списку відсортованих, і вставте його туди. Інтросорт. Або інтроспективний сорт. Він починається в швидкості і переходить на велику резорт при певному рівні рекурсії. Злиття сортування.Сортуйте першу та другу половини списку окремо, потім об'єднайте відсортовані списки. Млинець сорт. Зворотні елементи деякого префікса послідовності. Сорт голубів. Заповніть порожній масив усіма елементами масиву, який слід відсортувати, за порядком. Сорт листоноші. Ієрархічний варіант сортування відра, використовуваний поштовими відділеннями. Квікорт. Розділіть список на два, причому всі пункти першого списку передують усім пунктам другого списку; потім сортуйте два списки. Часто метод вибору. Радікс сортування. Сортуйте клавіші, пов’язані з елементами або цілими числами, обробляючи цифри. Вибір сортування. Виберіть найменший з решти елементів, додайте його до кінця відсортованого списку. Сорт раковини.Покращує сортування вставки з використанням проміжків між значеннями. Згладжування. Див. Стохастичний сорт. Дивіться Богоссорт.

та багато іншого...


0

Ви задали два питання у заголовку запитань, тож я відповім на обидва.

Так, Інформатика - це все про алгоритми. Ну ... насправді це трохи оману, тому що в інформатиці є багато аспектів, тому я перефразую. Інформатика, як вона застосовується в робочому світі, стосується переважно алгоритмів. Такі компанії, як Google, Facebook та всі ці шалені місця в Уолл-стріт наймають фізиків та розробників, хочуть, щоб дуже складні проблеми зводилися до простої форми, яка сама по собі потребує глибокого розуміння математики та дизайну алгоритмів.

Ні, програмування - це не все про алгоритми. Програмування полягає у прийнятті специфікацій та перетворенні їх у код, який можна скласти для виконання.

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

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