Какие понятия Информатики я должен знать? [закрытый]

При делении каждого значения на последнее значение в последнем утверждении карты вы игнорируете тот факт, что все уже вычтено из первого значения.

Чтобы исправить это, вы должны разделить диапазон значений (разница между максимальным значением и минимальным значением).

Если ваш массив отсортирован, это будет:

guard let maxValue = dates.last, let minValue = dates.first else {
    return
}
let percentages = dates
    .map {[110] - minValue}
    .map {[110] / (maxValue - minValue)}

Это нормализует все значения так, что первое значение равно 0, а последнее значение равно 1, а все остальное находится между ними.

Если вы не хотите нормализовать первое значение до 0 (но держите все от 0 до 1), вы можете пропустить шаг вычитания:

let percentages = dates.map {[111] / maxValue}

Если ваш массив не отсортирован, вы можете используйте функции .min() и .max() вашего массива:

guard let maxValue = dates.max(), let minValue = dates.min() else {
    return
}
92
задан 4 revs, 4 users 100% 14 April 2009 в 19:18
поделиться

33 ответа

Я думаю 3D-графика - это то, что каждый должен изучить. Или, по крайней мере, как правильно использовать однородные векторы и матричные преобразования.

Это может быть полезно не только для создания 3d-приложений, но и также в областях механики , таких как обратная кинематика для роботов, вычисление моментов и многое другое. о других вещах.

Я не полностью понимал линейную алгебру, пока не прочитал 3d-графику, один из лучших курсов, которые я когда-либо посещал, хотя наш учитель был плохим.

0
ответ дан TheDude 24 November 2019 в 06:28
поделиться

Я бы начал с цитаты:

«если единственный инструмент, который у вас есть, это молоток, ты относишься ко всему как nail ". (Abraham Maslow)

Самый важный принцип, IMO, - это знать множество различных парадигм программирования, языков и хорошо информироваться о доступных инструментах. Любая проблема может быть решена практически на любом языке, который вы выберете, будь то Это полноценный основной язык с его огромной библиотекой по умолчанию или небольшим специализированным языком, таким как AutoHotKey. Первая задача программиста - определить, что использовать в соответствии со спецификацией проблемы. Некоторые концепции обеспечивают лучший подход к теме, какой бы ни была ваша основная цель. - изощренность, запутанность, производительность, переносимость, обслуживание, небольшой размер кода ...

В противном случае вы закончите, как некоторые из программистов, которые отчаянно пытаются сделать что-то на одном специализированном языке, в то время как проблема может быть тривиальной для решения в другой контекст программирования.

Этот совет согласуется с сегодняшней тенденцией для многоязычных проектов (например, веб-приложений, которые могут включать несколько языков в одном приложении, например C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... и даже различные парадигмы программирования (например, C # недавно ввел некоторые понятия из парадигм функционального программирования, лямбда-выражений).

Итак, основная вещь - постоянное обучение, навсегда :)

навсегда :)

навсегда :)

0
ответ дан majkinetor 24 November 2019 в 06:28
поделиться

Я бы сказал ниже, наиболее важные вещи

  • Объектно-ориентированное программирование
  • Концепции операционной системы
    • Процесс и нить.
    • Алгоритмы планирования.
  • Структура данных.
    • Тип хранения и сбора данных, типы (связанный список, хэш, массив и т. Д.)
    • Алгоритмы сортировки
    • Сложность алгоритмов

Затем перейдите к материалам, связанным с конкретным языком. Я надеюсь, что это полезно !!

0
ответ дан Mutant 24 November 2019 в 06:28
поделиться

Нет, не пузырьковая сортировка, быстрая сортировка. Это большая вещь - пузырьковая сортировка в среднем составляет O (n ^ 2), быстрая сортировка - O (n * log (n)).

0
ответ дан GoatRider 24 November 2019 в 06:28
поделиться

Я думаю, что важно понять основную теорию многопоточности, без этого даже трудно понять, что может возникнуть проблема, пока вы не отлаживаетесь на живом сервере в 4 часа в воскресенье утром.

Семафоры, критические разделы и события.

0
ответ дан Jim T 24 November 2019 в 06:28
поделиться

Структура и интерпретация компьютерных программ . Если вы понимаете эту книгу, все остальное можно легко построить на этом фундаменте. Если у вас возникли проблемы с концепциями, изложенными в книге, вы можете быть разработчиком программного обеспечения, но не ученым.

1
ответ дан lambdabunny 24 November 2019 в 06:28
поделиться

В качестве недавнего выпускника степени информатики я бы порекомендовал следующее:

  • Как упоминалось в различных постах Большой О нотация

    OO Design

    Структуры данных и алгоритмы (не могу помните точное название книги Я использовал, будет обновлять, если я помню)

    Операционные системы http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    Проблемы с НП

1
ответ дан CodeMonkey 24 November 2019 в 06:28
поделиться

Алгоритмы.

Научиться использовать язык программирования на нисходящем уровне - это то, чему вы можете научиться на ходу, но практически невозможно изобрести все широко используемые алгоритмы самостоятельно. Надо хотя бы знать, что можно и что можно ». С некоторыми проблемами покончено.

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

Подводя итог - взгляните на Введение в алгоритмы

Не нужно осваивать это, просто знайте, что происходит ...

1
ответ дан Liran Orevi 24 November 2019 в 06:28
поделиться

Правило 1: Программное обеспечение - это захват знаний . Программное обеспечение что-то значит. Если вам неясно, в чем смысл, потратьте больше времени на общение с пользователями, чтобы понять, что они делают.

Алгоритмы и структуры данных - это две стороны одной медали. Алгоритм зависит от структуры данных, структура данных зависит от алгоритма.

Отучите пузырьковую сортировку как можно быстрее. Шутки в сторону. Все современные языки (Java, Python и т. Д.) Имеют классы коллекций, которые реализуют лучшую сортировку, чем пузырьковая сортировка. Нет абсолютно никаких обстоятельств, при которых вы должны когда-либо использовать пузырьковую сортировку для чего-либо. Вы должны искать класс коллекции, который включает метод сортировки. Лучше, вы должны искать алгоритм, который полностью избегает сортировки.

Вы должны выучить несколько языков.

  • Язык программирования (Java, Python и т. Д.)

  • Язык оболочки.

  • Язык базы данных (SQL)

  • Языки представления (HTML и CSS)

  • Другие языки представления данных (XML, JSON)

Необходимо изучить несколько структур данных.

  • Последовательности (списки, кортежи, файлы) )

  • Иерархические (например, документы XML и HTML, а также базовая файловая система)

  • Реляционные (например, базы данных и файловая система с жесткими и мягкими ссылками)

  • Карты (или индексы или ассоциативные массивы) ), включая Hash Maps и Tree Maps

  • Sets

Плюс некоторый анализ алгоритмической сложности. Иногда называется «Большой О». Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка равна O ( n log ] n ).

JSON)

Вы должны изучить несколько структур данных.

  • Последовательности (списки, кортежи, файлы)

  • Иерархические (например, документы XML и HTML, а также базовая файловая система)

  • Реляционные (например, базы данных, и файловая система с добавленными жесткими и мягкими ссылками)

  • Карты (или индексы или ассоциативные массивы), включая Hash Maps и Tree Maps

  • Наборы

Плюс некоторый анализ алгоритмической сложности. Иногда называется «Большой О». Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка равна O ( n log ] n ).

JSON)

Вы должны изучить несколько структур данных.

  • Последовательности (списки, кортежи, файлы)

  • Иерархические (например, документы XML и HTML, а также базовая файловая система)

  • Реляционные (например, базы данных, и файловая система с добавленными жесткими и мягкими ссылками)

  • Карты (или индексы или ассоциативные массивы), включая Hash Maps и Tree Maps

  • Наборы

Плюс некоторый анализ алгоритмической сложности. Иногда называется «Большой О». Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка равна O ( n log ] n ).

и файловая система с добавленными жесткими и мягкими ссылками)

  • Карты (или индексы или ассоциативные массивы), включая Hash Maps и Tree Maps

  • Наборы

  • Плюс некоторый анализ алгоритмической сложности. Иногда называется «Большой О». Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка равна O ( n log ] n ).

    и файловая система с добавленными жесткими и мягкими ссылками)

  • Карты (или индексы или ассоциативные массивы), включая Hash Maps и Tree Maps

  • Наборы

  • Плюс некоторый анализ алгоритмической сложности. Иногда называется «Большой О». Почему плохая сортировка пузырьков заключается в том, что она O ( n ^ 2), где быстрая сортировка равна O ( n log ] n ).

    4
    ответ дан S.Lott 24 November 2019 в 06:28
    поделиться

    Так как машины с несколькими ядрами (оба CPU) и GPU) становятся стандартом, я бы сказал, чтобы включить Распределенные алгоритмы (от нескольких потоков к нескольким машинам). Очень важно понимать многопоточность и распределенную обработку. Извините, что ссылка не очень помогает.

    0
    ответ дан Erich Mirabal 24 November 2019 в 06:28
    поделиться

    Это, безусловно, хорошее понимание объектно-ориентированного программирования, хорошие руководящие принципы, такие как Принципы твердого тела и следуя установленным образцам и практикам.

    Если вы посмотрите на SOA или DDD, все они в конечном итоге прибегнут к какой-либо форме концепций ООП.

    Я бы порекомендовал вам приобрести несколько хороших книг по ООП, а также выбрать богатый язык. как C # или Java для начала

    ООП от Grady Booch

    (PHP, ребята, ребята, пожалуйста, не голосуйте за меня, я просто привожу несколько примеров для него, вы можете предоставить свои собственные ответы и предложения здесь )

    1
    ответ дан 2 revs, 2 users 96% 24 November 2019 в 06:28
    поделиться

    Постарайтесь понять все уровни программирования. С самого низкого уровня (сборка) до самого высокого уровня.

    Возьмите, например, рекурсию, которая является легкой особенностью :) Попробуйте изучить ассемблер и создайте программу, которая будет использовать рекурсию в сборке.

    1
    ответ дан Chrys 24 November 2019 в 06:28
    поделиться

    Некоторые концепции ОС

     ( memory, IO, Scheduling, process\Threads, multithreading )
    

    [хорошая книга " Современные операционные системы , 2-е издание, Эндрю С. Таненбаум"]

    Базовые знания о компьютерных сетях

    [хорошая книга Таненбаума

    Концепции OOPS

    Конечные автометы

    Язык программирования (сначала я изучил C, а затем C ++)

    Алгоритмы (Сложность времени \ пространства, сортировка, поиск, деревья, связанный список, стек, очередь)

    [хорошая книга Введение в алгоритмы ]

    2
    ответ дан 4 revs, 2 users 82% 24 November 2019 в 06:28
    поделиться

    Посмотрите на это сообщение в блоге Стива Йегге (ранее из Amazon, теперь в Google):

    В нем подробно рассматриваются пять наиболее важных концепций, которые разработчики должны знать:

    1. Базовое программирование (включая рекурсию, файловый ввод-вывод, форматированный вывод, циклы и т. Д.)
    2. Объектно-ориентированный дизайн (включая шаблоны проектирования и т. Д.). Вы должны быть в состоянии создать разумный дизайн ОО, а также понять концепции.
    3. Сценарии и регулярные выражения.
    4. Структуры данных - списки, наборы, хеш-таблицы, деревья, графики и т. Д., А также Big O нотация и алгоритмическая сложность.
    5. Биты, байты и двоичные числа - как числа представлены в компьютере и как ими манипулировать.
    35
    ответ дан 2 revs 24 November 2019 в 06:28
    поделиться

    Мне немного смешно, что вы ищете предметы по информатике , но найдите Википедия слишком академична: D

    Во всяком случае, здесь идет, в произвольном порядке:

    30
    ответ дан 3 revs 24 November 2019 в 06:28
    поделиться

    Некоторые концепции, которые помогли моему развитию (интеллект и код):

    • Lexing, Парсинг, Соответствие строк, Regex
    • Мемоизация
      • инкапсуляция / определение объема / замыкания
      • кэширование
    • Рекурсия
    • Итераторы / Генераторы
    • Функциональное программирование - потрясающая статья Джона Хьюза заставила меня задуматься «почему»

    Это целые области дискретной математики, но для CS требуется серьезное введение:

    • Матричная / линейная алгебра
    • Теория графов

    Хотя лекции и статьи Марка Джейсона-Доминуса часто бывают Направленный на Perl-хакеров, я думаю, что любой программист выиграет от его четкого представления и реального кода, особенно в Perl высшего порядка .

    14
    ответ дан 2 revs 24 November 2019 в 06:28
    поделиться

    Я бы сказал, что в настоящее время понимание объектно-ориентированного программирования является обязательным, даже если вам не нужно его использовать изо дня в день.

    Из этого я бы также сказал, что понимание наиболее распространенных моделей также может помочь.

    10
    ответ дан 2 revs, 2 users 80% 24 November 2019 в 06:28
    поделиться

    Я вижу несколько хороших концепций CS, но мало говорят о математике.

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

    В то время как мы находимся на предмете математики, линейная алгебра, как правило, является необходимым условием для продвинутых классов компьютерной графики.

    10
    ответ дан Berkshire 24 November 2019 в 06:28
    поделиться

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

    5
    ответ дан Mork0075 24 November 2019 в 06:28
    поделиться

    Для меня я многое получил из следующего курса в университетском университете

    • Управление проектами
    • Взаимодействие человека с компьютером ( Помогает нам, гикам, создавать более удобные для пользователя экраны)
    • Дизайн базы данных (включая работу баз данных, журналы транзакций, блокировки и т. Д.)
    • Хранилище данных
    • Графика (OpenGL)
    • Усовершенствованные алгоритмы
    • Структуры данных [1213 Вещи, которые я хотел бы сделать в университете

      • Построение компилятора
      • Шаблоны проектирования
      • Теория автоматов
    3
    ответ дан uriDium 24 November 2019 в 06:28
    поделиться

    ЛОГИКА - Я просто преувеличиваю важность логики в программировании. Вы сказали, что занимались машиностроением, поэтому вы должны знать, насколько математика может сделать вашу жизнь проще.

    Логика высказываний , Логика первого порядка , Логика второго порядка : это очень мощные инструменты. Наверное, самые (и единственные) важные вещи, которые я изучил в университете. Логика похожа на тяжелую артиллерию программиста - многие очень сложные проблемы (а также менее сложные) становятся намного проще, если вы поместите их в организованную, логическую форму. Это как линейная алгебра для инженеров-механиков.

    3
    ответ дан Tamas Czinege 24 November 2019 в 06:28
    поделиться

    Я думаю, что хорошее понимание того, как работает компилятор, полезно знать. У Ахо есть классическая книга о концепциях, используемых при создании компилятора. Название «Компиляторы: принципы, методы и инструменты». Его прозвище - Книга Дракона. Чтобы по-настоящему понять эту книгу, вы должны понимать формальные языки. У Хопкрофта есть хорошая книга на эту тему - Введение в теорию автоматов, языки и вычисления.

    3
    ответ дан zooropa 24 November 2019 в 06:28
    поделиться

    Взгляните на это сообщение в блоге Стива Йегге (ранее работавшего в Amazon, теперь в Google):

    В нем подробно рассматриваются пять наиболее важных концепций, которые должны знать разработчики:

    1. Базовое программирование (включая рекурсию, файловый ввод-вывод, форматированный вывод, циклы и т. Д.)
    2. Объектно-ориентированный дизайн (включая шаблоны проектирования так далее). Вы должны уметь создавать разумные объектно-ориентированные проекты, а также понимать концепции.
    3. Сценарии и регулярные выражения.
    4. Структуры данных - списки, множества, хэш-таблицы, деревья, графы и т. Д. - а также нотация Big O и алгоритмическая сложность.
    5. Биты, байты и двоичные числа - как числа представлены в компьютере и как ими управлять.
    59
    ответ дан 2 revs 24 November 2019 в 06:28
    поделиться

    Я не собираюсь рассказывать вам какие-либо конкретные концепции для изучения, но вместо этого рекомендую вам сделать много легкое чтение по широкому кругу тем. Не беспокойтесь о том, чтобы получить глубокое понимание каждого предмета, о котором вы читаете - на данный момент, более важно, чтобы вы могли распознать тип проблемы, на которую вы смотрите, так, чтобы Вы можете учиться точно в срок, когда действительно сталкиваетесь с этим. Другими словами, это нормально, если вы не знаете, как решить проблему комбинаторики, если вы знаете достаточно, чтобы найти «комбинаторику», когда вам нужно увидеть, сколько способов вы можете упорядочить набор объектов или выбрать подмножество.

    Википедия - довольно хороший ресурс для такого широкого просмотра, особенно если вы просто скимминг для начала. Еще лучше, особенно если вы находите Википедию слишком академичной или недоступной, это вики C2 . (Это, что интересно, оригинальная вики, изобретенная Уордом Каннингемом.

    1
    ответ дан John Hyland 24 November 2019 в 06:28
    поделиться

    Ну, червячная банка открыта! :)
    Я начал с электротехники.

    Дизайн реляционной базы данных: Отслеживание данных похоже на Арнольда в «Kindergarden Cop».
    Это может быть полный хаос. Надо контролировать.
    Как хранить ваши данные в наименьшем количестве мест с минимальным дублированием информации. Как сохранить ваши данные легкими и легкодоступными. Как контролировать рост и целостность данных.

    Дизайн пользовательского интерфейса (UI): Таким образом, пользователь должен получить доступ к данным, которые мы отслеживаем.
    Большинство интерфейсов разработано разработчиками. Таким образом, большинство пользовательских интерфейсов, к сожалению, параллельны дизайну базы данных. Пользователи не заботятся о дизайне данных вообще. Они просто хотят, чего хотят. Они хотят получить это легко. Обычно это требует большого отделения от дизайна данных и пользовательского интерфейса. Научитесь отделять «инженерных» вас от «южно-гостеприимных» вас.

    Объектно-ориентированное программирование: Многие языки сводятся к этому формату.

    Параллельная обработка - многопоточность: Многие процессоры сделай работу быстрее!
    Параллельные компьютеры существуют уже несколько десятилетий. Они были на наших рабочих столах уже некоторое время. В случае «облачных вычислений» массовая параллельная обработка является не только обязательной, но и предпочтительной. Это невероятно мощно! У параллельных разработчиков большой потенциал работы.

    Понимание бизнес-правил: Это поможет вам сделать большую часть вашей логики основанной на таблицах.
    Многие условия IFblock могут находиться в таблицах бизнес-правил. Чтобы изменить логику, просто измените информацию в таблице. Мало / Нет перекодирования. Маленькая / Нет перекомпиляции.

    События контролируют ... Методы выполняют свою работу:
    Делайте вещи в своем коде отдельно. Это позволяет другим делать обновления в будущем. Он также в некоторой степени параллелен структуре Model / View / Controller (MVC).

    PJ

    2
    ответ дан PJ 24 November 2019 в 06:28
    поделиться

    Матрица компетенций программиста подробно рассмотрела это, но я выделю пару:

    • Структуры данных
      • Расширенные структуры данных, такие как B-деревья, биномиальные кучи и кучи Фибоначчи, AVL / красные черные деревья, Splay-деревья, Skip Lists, попытки и т. Д.
    • Алгоритмы
      • Tree, Graph, простые жадные алгоритмы и алгоритмы «разделяй и властвуй», способны понять актуальность уровней этой матрицы.
    • Системное программирование
      • Понимает весь стек программирования, аппаратное обеспечение (ЦП + память + кэш + прерывания + микрокод), двоичный код, сборку, статическое и динамическое связывание, компиляцию, интерпретацию, JIT-компиляцию, сборку мусора, кучу, стек, адресацию памяти…
    • Контроль версий исходного кода
      • Знание распределенных систем VCS. Опробовал Bzr / Mercurial / Darcs / Git
    • Build Automation
      • Может настроить скрипт для сборки системы, а также документацию, установщики, сгенерировать заметки о выпуске и пометить код в системе контроля версий
    • Автоматическое тестирование
      • Понимает и умеет настраивать автоматические функциональные тесты, тесты нагрузки / производительности и пользовательского интерфейса.
    • Разложение проблемы
      • Использование соответствующих структур данных и алгоритмов и разработка универсального / объектно-ориентированного кода, который инкапсулирует аспекты проблемы, которые могут быть изменены.
    • Декомпозиция систем
      • Способен визуализировать и проектировать сложные системы с несколькими производственными линиями и интеграцией с внешними системами. Также должен уметь проектировать системы поддержки операций, такие как мониторинг, отчетность, отработки отказа и т. Д.
    6
    ответ дан cgp 24 November 2019 в 06:28
    поделиться

    Здесь уже упоминалось много хороших ответов, но я хотел добавить подмножество того, что важно, но пока До сих пор это не освещалось.

    После 15 лет профессиональной подготовки программного обеспечения для студентов старших курсов я обнаружил, что регулярно использую в школе некоторые из следующих понятий:

    • Общие концепции ОО и функции современного языка программирования (классы скрытие данных и т. д.).
    • Метрики производительности алгоритма (обозначение Big O). При разработке алгоритма, выполнении анализа Big O для определения стоимости алгоритма и поиска более эффективных альтернатив в узких местах.
    • Связанные списки и другие сложные структуры данных.
    • Быстрая сортировка и различные концепции сортировки.
    • Деревья и быстрые манипуляции с деревьями.

    Если ваш язык / платформа не '

    2
    ответ дан pearcewg 24 November 2019 в 06:28
    поделиться

    Я приветствую дискретную математику. Информатика - это абстракция. очень полезно учиться думать как математик.

    Я также хотел добавить к тому, что С.Лотт говорил о языках. Изучение множества типов языков тоже важно. Не только скомпилированные против скриптов. Но функциональный (ML, Lisp, Haskell) логический (Prolog) объектно-ориентированный (C ++, Java, Smalltalk) императив (C, Pascal, даже FORTRAN).

    Чем больше программных парадигм вы знаете, тем легче подобрать новые языки, когда приходит горячий новый язык!

    2
    ответ дан Brian Postow 24 November 2019 в 06:28
    поделиться

    Стремление к низкому сцеплению, высокому сцеплению .

    low coupling, high cohesion

    (Я украл это изображение с указанного выше веб-сайта)

    2
    ответ дан 24 November 2019 в 06:28
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: