Что преимуществом записи является ОС полностью в блоке?

Быстрое примечание, это почти наверняка путает Большую нотацию O (который является верхней границей) с нотацией Теты "Θ" (который, связанный с двумя сторонами). По моему опыту, это на самом деле типично для обсуждений в неакадемических настройках. Извинения за любой беспорядок вызываются.


Большая сложность O может визуализироваться с этим графиком:

Big O Analysis

Самое простое определение, которое я могу дать для Нотации "большого О", является этим:

Нотация "большого О" является относительным представлением сложности алгоритма.

В том предложении существуют некоторые важные и сознательно выбранные слова:

  • родственник: можно только сравнить яблоки с яблоками. Вы не можете сравнить алгоритм, чтобы сделать арифметическое умножение к алгоритму, который сортирует список целых чисел. Но сравнение двух алгоритмов, чтобы сделать арифметические операции (одно умножение, одно дополнение) скажут Вам что-то значимое;
  • представление: большой-O (в его самой простой форме) уменьшает сравнение между алгоритмами к единственной переменной. Та переменная выбрана на основе наблюдений или предположений. Например, сортирующие алгоритмы обычно сравниваются на основе операций сравнения (сравнение двух узлов для определения их родственника, заказывающего). Это предполагает, что сравнение является дорогим. Но что, если сравнение является дешевым, но свопинг является дорогим? Это изменяет сравнение; и
  • сложность: если мне требуется одна секунда для сортировки 10 000 элементов, сколько времени это возьмет меня для сортировки один миллион? Сложность в этом экземпляре является относительной мерой к чему-то еще.

Возвратитесь и перечитайте вышеупомянутое при чтении остальных.

Лучший пример Больших-O, о которых я могу думать, делает арифметику. Возьмите два числа (123456 и 789012). Основные арифметические операции, которые мы изучили в школе, были:

  • дополнение;
  • вычитание;
  • умножение; и
  • подразделение.

Каждый из них является операцией или проблемой. Метод решения их называют алгоритмом.

Дополнение является самым простым. Вы выстраиваете в линию числа (направо) и добавляете цифры в столбце, пишущий последнее количество того дополнения в результате. Часть 'десятков' того числа перенесена на следующий столбец.

Давайте предположим, что добавление этих чисел является самой дорогой операцией в этом алгоритме. Это выдерживает обосновать, что для добавления этих двух чисел вместе мы должны добавить вместе 6 цифр (и возможно нести 7-е). Если мы добавляем два 100 чисел цифры вместе, мы должны сделать 100 дополнений. Если мы добавляем два 10 000 чисел цифры, мы должны сделать 10 000 дополнений.

Видеть шаблон? Сложность (являющийся количеством операций) прямо пропорциональна к количеству цифр n в большем числе. Мы называем этот O (n) или линейная сложность.

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

Умножение отличается. Вы выстраиваете в линию числа, берете первую цифру в нижнем числе и умножаете его в свою очередь против каждой цифры в главном числе и так далее через каждую цифру. Таким образом для умножения наш два 6 чисел цифры мы должны сделать 36 умножения. Мы, возможно, должны сделать, целых 10 или 11 столбцов добавляют для получения конечного результата также.

Если у нас есть два 100-разрядных числа, мы должны сделать, 10 000 умножения и 200 добавляет. Для два один миллион чисел цифры мы должны сделать один триллион (1012), умножение и два миллиона добавляет.

Поскольку алгоритм масштабируется с n-squared, это - O (n2) или квадратичная сложность. Это - хорошее время для представления другого важного понятия:

Мы только заботимся о старшей значащей части сложности.

Проницательное, возможно, поняло, что мы могли выразить количество операций как: n2 + 2n. Но поскольку Вы видели от нашего примера с двумя числами миллиона цифр за штуку, второй срок (2n) становится незначительным (составление 0,0002% общих операций тем этапом).

Можно заметить, что мы приняли худший вариант развития событий здесь. В то время как умножение 6 чисел цифры, если у одного из них есть 4 цифры и другая, имеет 6 цифр, то у нас только есть 24 умножения. Однако, мы вычисляем худший вариант развития событий для этого 'n', т.е. когда оба - 6 чисел цифры. Следовательно Нотация "большого О" о Худшем варианте алгоритма.

Телефонная книга

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

Теперь, если Вы давали компьютеру команду искать номер телефона для "John Smith" в телефонной книге, которая содержит 1 000 000 имен, что Вы сделали бы? Игнорирование того, что Вы могли предположить, как далеко в запущенном S (позволяют нам принять Вас, не может), что Вы сделали бы?

Типичная реализация могла бы быть должна открыться до середины, взять 500,000-е и сравнить его с "Smith". Если это, оказывается, "Smith, John", мы просто вернулись к реальности удачливые. Намного более вероятно то, что "John Smith" будет прежде или после того имени. Если это - после того, как мы затем разделим последнюю половину телефонной книги в половине и повторении. Если это к тому времени, мы делим первую половину телефонной книги в половине и повторении. И так далее.

Это называют двоичным поиском и используют каждый день в программировании, понимаете ли Вы это или нет.

Таким образом, если Вы хотите найти имя в телефонной книге миллиона имен, можно на самом деле найти любое имя путем выполнения этого самое большее 20 раз. В сравнении алгоритмов поиска мы решаем, что это сравнение является нашим 'n'.

  • Для телефонной книги 3 имен требуется 2 сравнения (самое большее).
  • Для 7 это берет самое большее 3.
  • Для 15 это берет 4.
  • Для 1,000,000 это берет 20.

Это потрясающе хорошо не так ли?

В Больших-O терминах это - O (зарегистрируйте n), или логарифмическая сложность. Теперь рассматриваемый логарифм мог быть ln (основывайте e), log10, log2 или некоторая другая основа. Не имеет значения, что это все еще O (зарегистрируйте n) точно так же, как O (2n2) и O (100n2) тихи оба O (n2).

Стоит в этой точке объяснить, что Большой O может использоваться для определения трех случаев с алгоритмом:

  • Лучший Случай: В телефонном поиске книги лучший случай - то, что мы находим имя в одном сравнении. Это - O (1) или постоянная сложность;
  • Ожидаемый Случай: Как обсуждено выше этого O (зарегистрируйте n); и
  • Худший Случай: Это также O (зарегистрируйте n).

Обычно мы не заботимся о лучшем случае. Мы интересуемся ожидаемым и худшим случаем. Иногда один или другие из них будет более важным.

Назад к телефонной книге.

Что, если Вы имеете номер телефона и хотите найти имя? У полиции есть обратная телефонная книга, но такие поиски отклонены широкой публике. Или они? Технически можно инвертировать поиск число в книге обычного телефона. Как?

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

Таким образом для нахождения имени, учитывая номер телефона (инвертируют поиск):

  • Лучший случай: O (1);
  • Ожидаемый случай: O (n) (для 500 000); и
  • Худший случай: O (n) (для 1,000,000).

Коммивояжер

Это - вполне известная проблема в информатике и заслуживает упоминания. В этой проблеме у Вас есть города N. Каждый из тех городов связан с 1 или более другими городами дорогой определенного расстояния. Проблема Коммивояжера состоит в том, чтобы найти самый короткий тур, который посещает каждый город.

Простые звуки? Думайте снова.

Если у Вас есть 3 города A, B и C с дорогами между всеми парами затем, Вы могли пойти:

  • → B → C
  • → C → B
  • B → C → A
  • B → → C
  • C → → B
  • C → B → A

Хорошо на самом деле существуют меньше, чем что, потому что некоторые из них эквивалентны (→ B → C и C → B → A эквивалентен, например, потому что они используют те же дороги, просто наоборот).

В действительности существует 3 возможности.

  • Возьмите это в 4 города, и у Вас есть (iirc) 12 возможностей.
  • С 5 это 60.
  • 6 становится 360.

Это - функция математической операции, названной факториалом. В основном:

  • 5! = 5 × 4 × 3 2 × 1 = 120
  • 6! = 6 × 5 × 4 × 3 2 × 1 = 720
  • 7! = 7 × 6 × 5 × 4 × 3 2 × 1 = 5040
  • 25! = 25 2 × 1 × 24 × … × = 15,511,210,043,330,985,984,000,000
  • 50! = 50 2 × 1 × 49 × … × = 3.04140932 × 1064

Таким образом, Большой-O из проблемы Коммивояжера является O (n!) или факториальная или комбинаторная сложность.

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

Что-то для размышления о.

Полиномиальное время

Другое мнение, о котором я хотел высказать быстрое упоминание, - то, что любой алгоритм, который имеет сложность O (na), как говорят, имеет полиномиальную сложность или разрешим в полиномиальное время.

O (n), O (n2) и т.д. все полиномиальное время. Некоторые проблемы не могут быть решены в полиномиальное время. Определенные вещи используются в мире из-за этого. Шифрование с открытым ключом является главным примером. В вычислительном отношении трудно найти два простых множителя очень большого количества. Если бы это не было, то мы не могли бы использовать системы с открытым ключом, которые мы используем.

Так или иначе вот именно для моего (надо надеяться, простой английский язык) объяснение Большого O (пересмотрено).

6
задан Lawand 19 August 2009 в 21:24
поделиться

9 ответов

Взаимодействие с ОС, как правило, проще всего на том языке, на котором она была написана - C в UNIX и Win32, C ++ в BeOS и т. Д. MenuetOS был разработан специально для упрощения разработки приложений сборки, поэтому лучшим выбором было написать саму ОС на ассемблере.

Для ОС, которые не предназначены для общего назначения, таких как встроенные системы и микроконтроллеры, накладные расходы, вызванные механическим преобразованием (т. е. компиляцией) языка C в ассемблер, может быть неприемлемым. Компиляторы не так умны, как люди, особенно когда дело доходит до некоторых неудобных оптимизаций, требуемых на встроенных платформах, а запись непосредственно на ассемблере гарантирует, что компилятор не испортит тщательно разработанные алгоритмы.

9
ответ дан 8 December 2019 в 04:30
поделиться

Предположительно, вы сможете написать компактную и быструю ОС. Хотя, возможно, вы не сможете написать его быстро и потеряете всякую надежду на тривиальную переносимость.

5
ответ дан 8 December 2019 в 04:30
поделиться

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

3
ответ дан 8 December 2019 в 04:30
поделиться

Думаю, преимуществом было то, что это дало им хороший пиар, учитывая количество мест, где я видел эту историю. Репутация дает вам лучшие рабочие места ...

3
ответ дан 8 December 2019 в 04:30
поделиться

Главное преимущество: вам не нужен компилятор C . Вторичное преимущество: если вам нужно сделать размер кода действительно очень маленьким, то (а) современные компиляторы нацелены больше на быстрое выполнение, чем на небольшой размер кода, и (б) человеческий штраф за написание кода сборки меньше, если артефакт меньше.

Итак, если вы делаете действительно крошечную ОС для какой-то новой встроенной ISA, и все это должно уместиться в 4K,

3
ответ дан 8 December 2019 в 04:30
поделиться

Думаю, просто производительность и размер.

0
ответ дан 8 December 2019 в 04:30
поделиться

По-прежнему существует активное сообщество людей, которые выпускают демки на ассемблере. Есть сайты, где люди даже кодируют демонстрационные версии для 8-битных машин, таких как машины C64 и Atari XL. Это просто их «любимое оружие». И им нравится кодировать в этом формате. И обеспечивает более высокую степень контроля, но требует более глубокого понимания машины. Их мастерство над машиной и способность выполнять целые исполняемые файлы с меньшим объемом памяти, чем занимают стандартные библиотеки C, обеспечивают им интенсивное удовлетворение.

Независимо от того, насколько хорош ваш компилятор, он по-прежнему следует механическому процессу при генерации кода. Сборка в значительной степени дает вам полный контроль, позволяя делать вещи, которые трудно представить даже на таком языке, как C. Например, «Атомарные операции». обычно оборачиваются либо вызовом ОС, либо вызовом функции, что делает их существенно менее эффективными, поскольку нет стандартного способа их представления на языке, на котором они написаны. (Иногда они будут представлены внутренним расширением компилятора для C.)

Также это позволяет делать нетрадиционные вещи, например, использовать стек процессора способами, которые вы НЕ МОЖЕТЕ в C. (Таким образом, в C вы создаете " Стековая структура данных с использованием динамического распределения памяти для репликации некоторых вещей, которые процессор может делать изначально.)

Size wize, я видел полноэкранный текстовый режим, текстовый редактор, который требовал менее 512 байт для исполняемого образа. Это написал парень, которого я знал по доскам объявлений. (До WWW эры.) Я видел код запуска C, который занимал больше памяти, чем это!

я. (Иногда они будут представлены внутренним расширением компилятора для C.)

Также это позволяет делать нетрадиционные вещи, например, использовать стек процессора способами, которые вы НЕ МОЖЕТЕ в C. (Таким образом, в C вы создаете " Стековая структура данных с использованием динамического распределения памяти для репликации некоторых вещей, которые процессор может делать изначально.)

Size wize, я видел полноэкранный текстовый режим, текстовый редактор, требовавший менее 512 байт для исполняемого образа. Это написал парень, которого я знал по доскам объявлений. (До WWW эры.) Я видел код запуска C, который занимал больше памяти, чем это!

я. (Иногда они будут представлены внутренним расширением компилятора для C.)

Также это позволяет делать нетрадиционные вещи, например, использовать стек процессора способами, которые вы НЕ МОЖЕТЕ в C. (Таким образом, в C вы создаете " Стековая структура данных с использованием динамического распределения памяти для репликации некоторых вещей, которые процессор может делать изначально.)

Size wize, я видел полноэкранный текстовый режим, текстовый редактор, который требовал менее 512 байт для исполняемого образа. Это написал парень, которого я знал по доскам объявлений. (До WWW эры.) Я видел код запуска C, который занимал больше памяти, чем это!

(Таким образом, в C вы создаете структуру данных "Stack", используя динамическое выделение памяти для репликации некоторых вещей, которые процессор может делать изначально.)

Size wize, я видел полноэкранный текстовый режим, текстовый редактор, который требовался менее 512 байтов для исполняемого образа. Это написал парень, которого я знал по доскам объявлений. (До WWW эры.) Я видел код запуска C, который занимал больше памяти, чем это!

(Таким образом, в C вы создаете структуру данных "Stack", используя динамическое выделение памяти для репликации некоторых вещей, которые процессор может делать изначально.)

Size wize, я видел полноэкранный текстовый режим, текстовый редактор, который требовался менее 512 байтов для исполняемого образа. Это написал парень, которого я знал по доскам объявлений. (До WWW эры.) Я видел код запуска C, который занимал больше памяти, чем это!

3
ответ дан 8 December 2019 в 04:30
поделиться

Кто-то может сказать - скорость и небольшой код (под небольшим кодом я, конечно, не имею в виду исходный код, а скомпилированный), по второму - наверное, да, по скорости - Я не знаю, насколько велики различия, если предположить, что у вас есть приличный компилятор C. Но могу отметить один большой минус - такую ​​ОС нельзя портировать на другие архитектуры, написание ОС на ассемблере привязывает вас к одной и выбранной архитектуре процессора. Я даже не буду упоминать время, которое нужно потратить на написание такого программного обеспечения по сравнению с C.

0
ответ дан 8 December 2019 в 04:30
поделиться

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

-1
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

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