Об'єктивна відповідь:
Хоча моя початкова відповідь на це запитання ґрунтувалася на моєму емпіричному досвіді як студента CS, який скоро закінчився, та на моїй прогнозованій думці про тип людей, з якими я хотів би працювати у сфері CS. Насправді є об'єктивна (стосовно суб'єктивних думок ACM SIGCSE та IEEE обчислювальних товариств) відповідь. Кожні 10 років органи ACM та IEEE співпрацюють над спільною публікацією, в якій детально розглядаються пропозиції щодо бакалаврської програми з інформатики на основі професійних знань про стан обчислювальної галузі. Більше інформації можна знайти на сайті cs2013.org . Комітет публікує підсумковий звіт з переліком їх рекомендацій щодо навчальних програм .
Однак, я все ще думаю, що мій список досить гарний.
Оригінальна відповідь нижче.
Що я повинен знати?
Мінімум
Я думаю, що досвідчений програміст повинен мати принаймні ступінь бакалаврату з інформатики. Звичайно, ви можете бути ефективними на багатьох робочих місцях лише з невеликим підмножиною Комп'ютерних наук через сильну спільноту CS, що сидить, і звуження уваги більшості професійних посад. Крім того, багато людей будуть додатково спеціалізуватися після бакалаврату. Однак я не думаю, що це не привід не бути прихильним до фундаментальних знань CS.
Щоб відповісти на головне запитання, ось що повинен знати студент бакалаврату (фундамент адекватного програміста) після закінчення навчання:
Структури даних
- Машинне представлення даних
- Одні, доповнення двох та пов'язана з ними арифметика
- Слова, покажчики, плаваюча точка
- Бітовий доступ, зсув та маніпуляція
- Пов'язані списки
- Хеш-таблиці (карти чи словники)
- Масиви
- Дерева
- Стеки
- Черги
- Графіки
- Бази даних
Алгоритми
- Сортування:
- Сортування бульбашок (щоб знати, чому це погано)
- Сортування вставки
- Об’єднати сортування
- Швидкий сортування
- Сорти в стилі Radix, підрахунок сортування та сортування відра
- Сортування купи
- Бого і квантовий сортування (=
- Пошук:
- Лінійний пошук
- Двійковий пошук
- Перший пошук по глибині
- Перший пошук ширини
- Рядок маніпуляції
- Ітерація
- Обхід дерева
- Перехід списку
- Функції хешування
- Конкретна реалізація таблиці хешу, дерева, списку, стека, черги, масиву та набору або колекції
- Алгоритми планування
- Обхід файлової системи та маніпуляція (на рівні inode або еквівалент).
Шаблони дизайну
- Модуляризація
- Заводська
- Будівельник
- Сінглтон
- Перехідник
- Декоратор
- Легкий вага
- Спостерігач
- Ітератор
- Штат [машина]
- Контролер перегляду моделі
- Шаблони програмування ниток та паралельних програм
Парадигми
- Імператив
- Об'єктно-орієнтована
- Функціональний
- Декларативний
- Статичне та динамічне програмування
- Розмітка даних
Теорія складності
- Простори простору
- Обчислюваність
- Регулярні, безтекстові та універсальні машини Тьюрінга на повному мовах
- Регулярні вирази
- Підрахунок та основна комбінаторика
Поза
Щоб дізнатися про те, про що ви питаєте, пізніше у вашому запитанні, якщо ви знайомі з вищесказаним, вам слід легко визначити відповідну схему, алгоритм та структуру даних для заданого сценарію. Однак слід визнати, що найкращого рішення часто не існує. Іноді від вас може знадобитися вибрати менше двох злом або навіть просто вибрати між двома однаково життєздатними рішеннями. Через це вам потрібні загальні знання, щоб мати можливість відстояти свій вибір від своїх однолітків.
Ось кілька порад щодо алгоритмів та структур даних:
- Бінарний пошук можна використовувати (і повинен) використовувати лише для відсортованих даних.
- Сорти в стилі Radix є приголомшливими, але лише тоді, коли у вас є сортовані обмежені класи.
- Дерева корисні майже для всього, як і столу хешу. Функціонал таблиці Hash можна екстраполювати і використовувати для вирішення багатьох проблем ціною ефективності.
- Масиви можна використовувати для резервування більшості структур даних більш високого рівня. Іноді "структура даних" - це не більше ніж якась розумна математика для доступу до місць у масиві.
- Вибір мови може бути різницею між витягуванням волосся або пропливом через проблему.
- Таблиця ASCII та масив 128 елементів утворюють неявну хеш-таблицю (=
- Регулярні вирази можуть вирішити багато проблем, але їх не можна використовувати для розбору HTML .
- Іноді структура даних так само важлива, як алгоритм.
Деякі з перерахованих вище можуть здатися відсутніми, а деякі можуть здаватися невиразними. Якщо ви хочете, щоб я детальніше пішов, я можу. Але, я сподіваюсь, що зіткнувшись з більш конкретним питанням, таким як "Створити функцію, яка враховує кількість зустрічей кожного символу в рядку", ви подивитесь на підказку щодо таблиці ASCII та масивів 128 елементів, що утворюють акуратний неявний хеш таблиці для відповіді.
Виходячи з цих ідей, я запропоную відповідь на проблему шафки, викладену у вашому запитанні.
Відповідь на проблему, поставлену у вашому запитанні.
Це може бути не найкращою відповіддю на ваше запитання, але я думаю, що це цікавий, що не вимагає нічого занадто складного. І це, безумовно, обіграє складність у часі використання черги, або стека, який вимагає лінійного часу, щоб визначити, вільний шафка чи ні.
У вас 0-999 шаф. Тепер, оскільки у вас фіксована кількість шаф, ви можете легко створити функцію хешування без колізій на діапазоні 0-999. Ця функція просто h (x) = x mod 1000. Тепер [концептуально] побудуйте хеш-таблицю з цілими ключами та вмістом масиву char 1000 елементів як ваших значень. Якщо клієнт хоче зарезервувати шафку 78 для використання, просто поставте 78 у хеш-функцію (повертаючи 78), а потім додайте це число до базового покажчика масиву - зберігаючи справжнє значення у місці, на яке вказує зміщене значення . Аналогічно, якщо вам потрібно перевірити, чи використовується 78, просто прочитайте значення, збережене в цьому місці, і перевірте, чи не відповідає істині.
Це рішення працює в постійному часі для пошуку та зберігання, на відміну від зберігання та пошуку журналу (n) часу у випадку черги пріоритету, підтримуваної двійковим деревом. Опис навмисно багатослівний, так що ви можете бачити вищі поняття, зведені в ефективний алгоритм.
Тепер ви можете запитати: що, якщо мені потрібно знати всі наявні шафи, чи не буде черговістю пріоритетності краще? Якщо в черзі пріоритетності є k доступних шаф, ітерація над усіма ними виконуватиме k кроки. Крім того, залежно від реалізації вашої черги пріоритетів, можливо, вам доведеться перебудувати свою чергу пріоритетів, коли ви все це переглянете .. що би ввело к * log (k): (k <1000) кроків. У рішенні масиву вам потрібно лише повторити масив 1000 елементів і перевірити, які з них є відкритими. Ви також можете додати доступний або використаний список до реалізації, щоб перевірити лише час.