При делении каждого значения на последнее значение в последнем утверждении карты вы игнорируете тот факт, что все уже вычтено из первого значения.
Чтобы исправить это, вы должны разделить диапазон значений (разница между максимальным значением и минимальным значением).
Если ваш массив отсортирован, это будет:
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
}
Я думаю 3D-графика - это то, что каждый должен изучить. Или, по крайней мере, как правильно использовать однородные векторы и матричные преобразования.
Это может быть полезно не только для создания 3d-приложений, но и также в областях механики , таких как обратная кинематика для роботов, вычисление моментов и многое другое. о других вещах.
Я не полностью понимал линейную алгебру, пока не прочитал 3d-графику, один из лучших курсов, которые я когда-либо посещал, хотя наш учитель был плохим.
Я бы начал с цитаты:
«если единственный инструмент, который у вас есть, это молоток, ты относишься ко всему как nail ". (Abraham Maslow)
Самый важный принцип, IMO, - это знать множество различных парадигм программирования, языков и хорошо информироваться о доступных инструментах. Любая проблема может быть решена практически на любом языке, который вы выберете, будь то Это полноценный основной язык с его огромной библиотекой по умолчанию или небольшим специализированным языком, таким как AutoHotKey. Первая задача программиста - определить, что использовать в соответствии со спецификацией проблемы. Некоторые концепции обеспечивают лучший подход к теме, какой бы ни была ваша основная цель. - изощренность, запутанность, производительность, переносимость, обслуживание, небольшой размер кода ...
В противном случае вы закончите, как некоторые из программистов, которые отчаянно пытаются сделать что-то на одном специализированном языке, в то время как проблема может быть тривиальной для решения в другой контекст программирования.
Этот совет согласуется с сегодняшней тенденцией для многоязычных проектов (например, веб-приложений, которые могут включать несколько языков в одном приложении, например C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... и даже различные парадигмы программирования (например, C # недавно ввел некоторые понятия из парадигм функционального программирования, лямбда-выражений).
Итак, основная вещь - постоянное обучение, навсегда :)
навсегда :) навсегда :)Я бы сказал ниже, наиболее важные вещи
Затем перейдите к материалам, связанным с конкретным языком. Я надеюсь, что это полезно !!
Нет, не пузырьковая сортировка, быстрая сортировка. Это большая вещь - пузырьковая сортировка в среднем составляет O (n ^ 2), быстрая сортировка - O (n * log (n)).
Я думаю, что важно понять основную теорию многопоточности, без этого даже трудно понять, что может возникнуть проблема, пока вы не отлаживаетесь на живом сервере в 4 часа в воскресенье утром.
Семафоры, критические разделы и события.
Структура и интерпретация компьютерных программ . Если вы понимаете эту книгу, все остальное можно легко построить на этом фундаменте. Если у вас возникли проблемы с концепциями, изложенными в книге, вы можете быть разработчиком программного обеспечения, но не ученым.
В качестве недавнего выпускника степени информатики я бы порекомендовал следующее:
Как упоминалось в различных постах Большой О нотация
OO Design
Структуры данных и алгоритмы (не могу помните точное название книги Я использовал, будет обновлять, если я помню)
Операционные системы http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Проблемы с НП
Алгоритмы.
Научиться использовать язык программирования на нисходящем уровне - это то, чему вы можете научиться на ходу, но практически невозможно изобрести все широко используемые алгоритмы самостоятельно. Надо хотя бы знать, что можно и что можно ». С некоторыми проблемами покончено.
Например, невозможно написать некоторые программы с пузырьковой сортировкой и ожидать, что она будет считаться хорошей, независимо от того, насколько хорош код.
Подводя итог - взгляните на Введение в алгоритмы
Не нужно осваивать это, просто знайте, что происходит ...
Правило 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 ).
Так как машины с несколькими ядрами (оба CPU) и GPU) становятся стандартом, я бы сказал, чтобы включить Распределенные алгоритмы (от нескольких потоков к нескольким машинам). Очень важно понимать многопоточность и распределенную обработку. Извините, что ссылка не очень помогает.
Это, безусловно, хорошее понимание объектно-ориентированного программирования, хорошие руководящие принципы, такие как Принципы твердого тела и следуя установленным образцам и практикам.
Если вы посмотрите на SOA или DDD, все они в конечном итоге прибегнут к какой-либо форме концепций ООП.
Я бы порекомендовал вам приобрести несколько хороших книг по ООП, а также выбрать богатый язык. как C # или Java для начала
(PHP, ребята, ребята, пожалуйста, не голосуйте за меня, я просто привожу несколько примеров для него, вы можете предоставить свои собственные ответы и предложения здесь )
Постарайтесь понять все уровни программирования. С самого низкого уровня (сборка) до самого высокого уровня.
Возьмите, например, рекурсию, которая является легкой особенностью :) Попробуйте изучить ассемблер и создайте программу, которая будет использовать рекурсию в сборке.
Некоторые концепции ОС
( memory, IO, Scheduling, process\Threads, multithreading )
[хорошая книга " Современные операционные системы , 2-е издание, Эндрю С. Таненбаум"]
Базовые знания о компьютерных сетях
[хорошая книга Таненбаума
Концепции OOPS
Конечные автометы
Язык программирования (сначала я изучил C, а затем C ++)
Алгоритмы (Сложность времени \ пространства, сортировка, поиск, деревья, связанный список, стек, очередь)
[хорошая книга Введение в алгоритмы ]
Посмотрите на это сообщение в блоге Стива Йегге (ранее из Amazon, теперь в Google):
В нем подробно рассматриваются пять наиболее важных концепций, которые разработчики должны знать:
Мне немного смешно, что вы ищете предметы по информатике , но найдите Википедия слишком академична: D
Во всяком случае, здесь идет, в произвольном порядке:
Некоторые концепции, которые помогли моему развитию (интеллект и код):
Это целые области дискретной математики, но для CS требуется серьезное введение:
Хотя лекции и статьи Марка Джейсона-Доминуса часто бывают Направленный на Perl-хакеров, я думаю, что любой программист выиграет от его четкого представления и реального кода, особенно в Perl высшего порядка .
Я бы сказал, что в настоящее время понимание объектно-ориентированного программирования является обязательным, даже если вам не нужно его использовать изо дня в день.
Из этого я бы также сказал, что понимание наиболее распространенных моделей также может помочь.
Я вижу несколько хороших концепций CS, но мало говорят о математике.
Я предлагаю вам взглянуть на дискретная математика . Он имеет широкий круг полезных проблем, начиная с логических доказательств, которые помогают вам писать условия в коде. Теория графов и комбинаторика также помогают в решении сложных задач и оптимизации алгоритмов.
В то время как мы находимся на предмете математики, линейная алгебра, как правило, является необходимым условием для продвинутых классов компьютерной графики.
Я считаю очень полезными графики и некоторые применяемые алгоритмы, такие как глубина во-первых, поиск по дыханию, кратчайшие пути и т.д. Ориентация на объект - это также очень распространенное понятие.
Для меня я многое получил из следующего курса в университетском университете
ЛОГИКА - Я просто преувеличиваю важность логики в программировании. Вы сказали, что занимались машиностроением, поэтому вы должны знать, насколько математика может сделать вашу жизнь проще.
Логика высказываний , Логика первого порядка , Логика второго порядка : это очень мощные инструменты. Наверное, самые (и единственные) важные вещи, которые я изучил в университете. Логика похожа на тяжелую артиллерию программиста - многие очень сложные проблемы (а также менее сложные) становятся намного проще, если вы поместите их в организованную, логическую форму. Это как линейная алгебра для инженеров-механиков.
Я думаю, что хорошее понимание того, как работает компилятор, полезно знать. У Ахо есть классическая книга о концепциях, используемых при создании компилятора. Название «Компиляторы: принципы, методы и инструменты». Его прозвище - Книга Дракона. Чтобы по-настоящему понять эту книгу, вы должны понимать формальные языки. У Хопкрофта есть хорошая книга на эту тему - Введение в теорию автоматов, языки и вычисления.
Взгляните на это сообщение в блоге Стива Йегге (ранее работавшего в Amazon, теперь в Google):
В нем подробно рассматриваются пять наиболее важных концепций, которые должны знать разработчики:
Я не собираюсь рассказывать вам какие-либо конкретные концепции для изучения, но вместо этого рекомендую вам сделать много легкое чтение по широкому кругу тем. Не беспокойтесь о том, чтобы получить глубокое понимание каждого предмета, о котором вы читаете - на данный момент, более важно, чтобы вы могли распознать тип проблемы, на которую вы смотрите, так, чтобы Вы можете учиться точно в срок, когда действительно сталкиваетесь с этим. Другими словами, это нормально, если вы не знаете, как решить проблему комбинаторики, если вы знаете достаточно, чтобы найти «комбинаторику», когда вам нужно увидеть, сколько способов вы можете упорядочить набор объектов или выбрать подмножество.
Википедия - довольно хороший ресурс для такого широкого просмотра, особенно если вы просто скимминг для начала. Еще лучше, особенно если вы находите Википедию слишком академичной или недоступной, это вики C2 . (Это, что интересно, оригинальная вики, изобретенная Уордом Каннингемом.
Ну, червячная банка открыта! :)
Я начал с электротехники.
Дизайн реляционной базы данных: Отслеживание данных похоже на Арнольда в «Kindergarden Cop».
Это может быть полный хаос. Надо контролировать.
Как хранить ваши данные в наименьшем количестве мест с минимальным дублированием информации. Как сохранить ваши данные легкими и легкодоступными. Как контролировать рост и целостность данных.
Дизайн пользовательского интерфейса (UI): Таким образом, пользователь должен получить доступ к данным, которые мы отслеживаем.
Большинство интерфейсов разработано разработчиками. Таким образом, большинство пользовательских интерфейсов, к сожалению, параллельны дизайну базы данных. Пользователи не заботятся о дизайне данных вообще. Они просто хотят, чего хотят. Они хотят получить это легко. Обычно это требует большого отделения от дизайна данных и пользовательского интерфейса. Научитесь отделять «инженерных» вас от «южно-гостеприимных» вас.
Объектно-ориентированное программирование: Многие языки сводятся к этому формату.
Параллельная обработка - многопоточность: Многие процессоры сделай работу быстрее!
Параллельные компьютеры существуют уже несколько десятилетий. Они были на наших рабочих столах уже некоторое время. В случае «облачных вычислений» массовая параллельная обработка является не только обязательной, но и предпочтительной. Это невероятно мощно! У параллельных разработчиков большой потенциал работы.
Понимание бизнес-правил: Это поможет вам сделать большую часть вашей логики основанной на таблицах.
Многие условия IFblock могут находиться в таблицах бизнес-правил. Чтобы изменить логику, просто измените информацию в таблице. Мало / Нет перекодирования. Маленькая / Нет перекомпиляции.
События контролируют ... Методы выполняют свою работу:
Делайте вещи в своем коде отдельно. Это позволяет другим делать обновления в будущем. Он также в некоторой степени параллелен структуре Model / View / Controller (MVC).
PJ
Матрица компетенций программиста подробно рассмотрела это, но я выделю пару:
Здесь уже упоминалось много хороших ответов, но я хотел добавить подмножество того, что важно, но пока До сих пор это не освещалось.
После 15 лет профессиональной подготовки программного обеспечения для студентов старших курсов я обнаружил, что регулярно использую в школе некоторые из следующих понятий:
Если ваш язык / платформа не '
Я приветствую дискретную математику. Информатика - это абстракция. очень полезно учиться думать как математик.
Я также хотел добавить к тому, что С.Лотт говорил о языках. Изучение множества типов языков тоже важно. Не только скомпилированные против скриптов. Но функциональный (ML, Lisp, Haskell) логический (Prolog) объектно-ориентированный (C ++, Java, Smalltalk) императив (C, Pascal, даже FORTRAN).
Чем больше программных парадигм вы знаете, тем легче подобрать новые языки, когда приходит горячий новый язык!
Стремление к низкому сцеплению, высокому сцеплению .
(Я украл это изображение с указанного выше веб-сайта)