Я не вважаю, що це важливо, окрім як передавати ідеї, і я працюю в критичних для продуктивності сферах (обробка променів, обробка зображень та сіток, системи частинок, фізичні двигуни тощо), і мені довелося розробити безліч фірмових алгоритмів та структур даних. під час роботи в НДДКР. У цих областях часто декілька дуже ефективних структур даних і алгоритмів можуть давати цілі нові передові продукти, тоді як алгоритми вчорашнього дня застаріли продукти, тому завжди потрібно робити ефективніше. Як застереження, я ніколи не публікував жодних робіт про алгоритми, які я розробив. Всі вони були власницькими. Якби я це зробив, мені знадобиться допомога математика, щоб сформулювати докази тощо.
Однак, на мою думку, обчислювальна робота за ітерацію часто представляє більш безпосередній інтерес, ніж масштабованість алгоритму, якщо алгоритм не масштабується дуже погано. Якщо хтось придумує сучасну техніку промінювання, мене більше цікавлять обчислювальні методи, такі як їх представлення та доступ до даних, ніж алгоритмічна складність, оскільки розумна масштабованість вже дана в цьому конкурентному та інноваційному сценарії. Ви не можете бути конкурентоспроможними, розробляючи алгоритми, які не змінюють масштаб.
Звичайно, якщо ви порівнюєте квадратичну складність з лінійної, це величезна різниця. Але більшість людей у моїй галузі досить компетентні, щоб уникнути застосування алгоритму квадратичної складності на епічному введенні. Тому масштабованість часто глибоко має на увазі, і більш змістовні та цікаві питання стають на зразок: "Чи використовували ви GPGPU? SIMD? Чи працює він паралельно? Як ви представляли дані? Ви реорганізували їх для зручних кеш-схеми доступу? Як багато пам’яті займає? Чи може вона надійно поводитися з цією справою? Ви відкладаєте певну обробку чи робите це все за один раз? "
Навіть лінійно-алгоритмічний алгоритм може перевершити алгоритм лінійного часу, якщо колишній звертається до пам'яті в більш оптимальному шаблоні, наприклад, або краще підходить для багатопотокового та / або SIMD. Іноді навіть лінійний алгоритм може перевершувати логарифмічний алгоритм з цих причин, а природно алгоритми лінійного часу перевершують логарифмічні для підліткових входів.
Отже, для мене важливіше те, що деякі люди можуть назвати "мікрооптимізаціями", як-от представлення даних (макети пам'яті, шаблони доступу з розбиттям гарячого / холодного поля тощо), багатопотоковість, SIMD та інколи GPGPU. У галузі, де кожен вже достатньо компетентний, щоб використовувати пристойні до найсучасніших алгоритмів для всього, коли нові публікації постійно публікуються, ваша конкурентоспроможність у переборі з майстрами алгоритміки не виходить з покращення алгоритмічної складності настільки, як більш прямого обчислювальна ефективність.
У моєму полі переважають геніальні математики, але не завжди ті, хто знає обчислювальну вартість того, що вони роблять, або безліч хитрощів нижчого рівня для прискорення коду. Це, як правило, моя перевага над ними в розробці більш швидких і жорстких алгоритмів і структур даних, незважаючи на те, що моя є набагато менш складною. Я граю до того, що любить обладнання, до бітів і байтів, і роблю кожну ітерацію роботи набагато дешевшою, навіть якщо я роблю на кілька більше ітерацій роботи, ніж справді складний алгоритм - робота в моєму випадку значно дешевша. Код, який я пишу, також є набагато простішим. Якщо люди думають, що мікрооптимізовані версії простих алгоритмів та структур даних важко зрозуміти та підтримувати,
Як основний приклад, я створив просту структуру сітки, яка в нашій компанії перевершила KD-дерево для виявлення зіткнень та видалення зайвих точок. Моя дурна сира сітка була настільки менш алгоритмічно алгоритмічна, і я набагато тупіший математично і алгоритмічно, ніж хлопець, який реалізував KD-дерево своїм новим способом пошуку медіанної точки, але я просто налаштував використання пам’яті моєї сітки та схеми доступу та цього було достатньо, щоб перевершити щось набагато складніше.
Ще одне ребро в мене, яке дозволяє мені виживати в галузі, де панують люди, розумніші за мене, - це просто дійсно розуміння того, як користувач працює, оскільки я використовую програмне забезпечення, яке я розробляю так само. Це дає мені ідеї щодо алгоритмів, які реально дуже швидко узгоджуються з інтересами користувачів. Як основний приклад там, більшість людей намагаються прискорити такі речі, як виявлення зіткнень, використовуючи просторову індексацію. Я зробив просте спостереження щодо формування кар'єри майже пару десятиліть тому для органічних моделей, які, наприклад, якщо персонаж кладе руки на обличчя, структура просторової індексації хотіла б мати розділення вузлів і робити дорогі оновлення, якщо персонаж потім зняв руку з обличчя. Якщо замість цього ви розділите на основі даних про зв’язок, а не вершинних позицій, Ви можете створити стабільну ієрархічну структуру, яка дуже швидко оновлюється і ніколи не потребує розділення або відновлення балансу дерева (доводиться лише оновлювати обмежувальні поля для кожного кадру анімації) ... такі речі - алгоритми малюка без важкого математичного походження можна було б придумати, якби вони просто зрозуміли основну концепцію, але ті, що ухилялися від математиків, оскільки не думали про речі таким чином, наближеним до того, як користувачі працювали і занадто багато думали лише про властивості геометрії, а не про те, як геометрія широко використовувався. Я досить добре ладжу, спираючись більше на загальні обчислювальні знання та знання користувачів, ніж на майстерність алгоритміки. Так що все-таки я не вважаю таким важливим зосередитись на алгоритмічній складності.