Каков информационный вес одного символа компьютерного алфавита, мощность которого равна 256

Обновлено: 02.07.2024

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

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

Хеш-таблица – это набор элементов, которые хранятся таким образом, чтобы их можно было легко найти позже. Каждая позиция хэш-таблицы, часто называемая слотом, может содержать элемент и именоваться целочисленным значением, начинающимся с 0. Например, у нас будет слот с именем 0, слот с именем 1, слот с именем 2 и т. д. на. Изначально хеш-таблица не содержит элементов, поэтому каждый слот пуст. Мы можем реализовать хэш-таблицу, используя список, в котором каждый элемент инициализируется специальным значением Python None. На рис. 4 показана хэш-таблица размера \(m=11\) . Другими словами, в таблице есть m слотов с именами от 0 до 10.

../_images/hashtable.jpg

Рисунок 4. Хэш-таблица с 11 пустыми слотами ¶

Сопоставление между элементом и слотом, которому этот элемент принадлежит в хеш-таблице, называется хеш-функцией. Хэш-функция возьмет любой элемент коллекции и вернет целое число в диапазоне имен слотов от 0 до m-1. Предположим, что у нас есть набор целых элементов 54, 26, 93, 17, 77 и 31. Наша первая хэш-функция, которую иногда называют «методом остатка», просто берет элемент и делит его на размер таблицы, возвращая остаток как его хэш-значение ( \(h(item)=item \% 11\) ). В таблице 4 приведены все значения хеш-функции для элементов нашего примера. Обратите внимание, что этот метод остатка (по модулю арифметики) обычно присутствует в той или иной форме во всех хэш-функциях, поскольку результат должен находиться в диапазоне имен слотов.

Таблица 4: Простая хэш-функция с использованием остатков ¶

Товар

Хэш-значение

После того как хэш-значения вычислены, мы можем вставить каждый элемент в хеш-таблицу в указанном месте, как показано на рис. 5. Обратите внимание, что 6 из 11 слотов сейчас заняты. Это называется коэффициентом нагрузки и обычно обозначается как \(\lambda = \frac \) . В этом примере \(\lambda = \frac \) .

../_images/hashtable2.jpg

Рисунок 5. Хэш-таблица с шестью элементами ¶

Теперь, когда мы хотим найти элемент, мы просто используем хэш-функцию для вычисления имени слота для элемента, а затем проверяем хэш-таблицу, чтобы увидеть, присутствует ли он. Эта операция поиска называется \(O(1)\) , поскольку для вычисления хеш-значения и последующего индексирования хеш-таблицы в этом месте требуется постоянное количество времени. Если все там, где должно быть, мы нашли алгоритм поиска с постоянным временем.

Вероятно, вы уже видите, что этот метод будет работать только в том случае, если каждый элемент сопоставляется с уникальным местоположением в хеш-таблице. Например, если бы элемент 44 был следующим элементом в нашей коллекции, его хеш-значение было бы равно 0 ( \(44 \% 11 == 0\) ). Так как 77 также имеет хэш-значение 0, у нас возникла бы проблема. В соответствии с хэш-функцией два или более элемента должны находиться в одном слоте. Это называется столкновением (его также можно назвать «столкновением»). Очевидно, что коллизии создают проблему для техники хэширования. Мы обсудим их подробно позже.

6.5.1. Хэш-функции¶

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

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

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

Метод складывания для построения хеш-функций начинается с разделения элемента на части одинакового размера (последняя часть может быть разного размера). Затем эти части складываются вместе, чтобы получить результирующее значение хеш-функции. Например, если бы нашим элементом был номер телефона 436-555-4601, мы бы взяли цифры и разделили их на группы по 2 (43,65,55,46,01). После сложения \(43+65+55+46+01\) мы получаем 210. Если мы предположим, что наша хеш-таблица имеет 11 слотов, то нам нужно выполнить дополнительный шаг деления на 11 и сохранения остатка. В этом случае \(210\ \%\ 11\) равно 1, поэтому номер телефона 436-555-4601 хэшируется на слот 1. Некоторые методы складывания идут на один шаг дальше и переворачивают каждую вторую часть перед добавлением. Для приведенного выше примера мы получаем \(43+56+55+64+01 = 219\), что дает \(219\ \%\ 11 = 10\) .

Еще один численный метод построения хеш-функции называется методом средних квадратов. Мы сначала возводим элемент в квадрат, а затем извлекаем часть полученных цифр. Например, если бы элемент был 44, мы сначала вычислили бы \(44 ^ = 1,936\) . Извлекая две средние цифры, 93, и выполняя оставшийся шаг, мы получаем 5 ( \(93\ \%\ 11\) ). В таблице 5 показаны элементы как по методу остатка, так и по методу середины квадрата. Вы должны убедиться, что понимаете, как вычислялись эти значения.

Таблица 5: Сравнение методов остатка и среднего квадрата ¶

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

Килобайт или КБ

  • Килобайт КБ – около 1 000 байт
  • Как мы знаем, 1 байт - это один набранный символ
    - см. ниже, почему здесь требуется фраза "около 1 тысячи"
  • Электронное письмо без изображений весит около 2 КБ.
  • Пятистраничный документ может весить 100 КБ.
  • Текст компактный, занимает меньше байтов по сравнению с изображениями, звуком или видео.
  • напр. 23 000 байт — это примерно 23 КБ
  • .

Один килобайт (КБ) – это совокупность примерно 1000 байт. Страница обычного латинского алфавитного текста занимает для хранения около 2 килобайт (около одного байта на букву). Типичное короткое электронное письмо также занимает всего 1 или 2 килобайта. Текст является одним из наиболее естественно компактных типов данных, для хранения каждой буквы требуется около одного байта. В нелатинских алфавитах, таких как мандарин, хранилище занимает 2 или 4 байта на «букву», что все еще довольно компактно по сравнению с аудио и изображениями.

Мегабайт или МБ

  • Мегабайт (МБ) – около 1 миллиона байт.
  • около 1000 КБ
  • Скорость звука в формате MP3 составляет около 1 МБ в минуту.
  • Цифровое изображение высокого качества весит около 2–5 МБ.
  • напр. 45 400 КБ равно 45,4 МБ.

Один мегабайт равен примерно 1 миллиону байт (или примерно 1000 килобайт). Аудиофайл MP3 длительностью несколько минут или изображение размером 10 миллионов пикселей с цифровой камеры обычно занимают несколько мегабайт. Эмпирическое правило для MP3-аудио гласит, что 1 минута аудио занимает около 1 мегабайта. Аудиоданные, изображения и видеоданные обычно хранятся в «сжатой» форме, например MP3. Мы поговорим о том, как работает сжатие позже. Компакт-диск с данными хранит около 700 МБ. Звук на компакт-диске не сжат, поэтому он занимает гораздо больше места, чем MP3. Серия битов представлена ​​в виде спиральной дорожки крошечных ямок в серебряном материале диска. Представьте, что каждая ямка интерпретируется как 0, а отсутствие ямки — 1 при чтении последовательности спирали. Забавный факт: вся спираль на компакт-диске имеет длину более 5 км.

Математика — попробуй

Гигабайт или ГБ

  • Гигабайт ГБ = около миллиарда байтов
  • около 1000 МБ
  • ГБ – общепринятая единица измерения современного оборудования.
  • напр. 4000 МБ = 4 ГБ
  • Обычный компьютер может иметь:
    –4 ГБ или ОЗУ,
    –256 ГБ постоянной памяти.
  • Диск DVD имеет емкость 4,7 ГБ (один слой)
  • – Цифра – 2 ГБ на час видео (сильно варьируется).
  • Флэш-накопитель может вмещать 32 ГБ.
  • На жестком диске может быть 750 ГБ.

  • Математика — попробуйте сами
  • Сколько ГБ составляют 4 000 000 000 байт?

Терабайт или ТБ

Один терабайт (ТБ) составляет около 1000 гигабайт, или примерно 1 триллион байт. Вы можете купить жесткие диски емкостью 4 ТБ уже сегодня, поэтому мы начинаем время, когда этот термин входит в обиход.Термин «гигабайт» тоже был экзотическим, пока закон Мура не сделал его общепринятым.

Гигагерцы — скорость, а не байты

Один гигагерц – это 1 миллиард циклов в секунду (мегагерц – миллион циклов в секунду). Гигагерц — это мера скорости, грубо говоря, скорость, с которой процессор может выполнять простейшую операцию в секунду. Гигагерц точно не говорит вам, как быстро ЦП выполняет работу, но примерно коррелирует. ЦП с более высокой частотой гигагерца также, как правило, дороже в производстве, и они потребляют больше энергии (и, как следствие, выделяют больше тепла) — проблема с размещением быстрых ЦП в небольших устройствах, таких как телефоны. Компания ARM славится тем, что выпускает очень производительные чипы при минимальном энергопотреблении и нагреве. В настоящее время почти все сотовые телефоны используют процессоры ARM.

Проблемы с килобайтами, мегабайтами и гигабайтами

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

Базовый план: прежде чем добавлять показатели X и Y, преобразуйте их в одни и те же единицы измерения.

Да, подходит: 600 МБ + 2000 МБ — это 2600 МБ. 2600 МБ — это 2,6 ГБ, поэтому на 4 ГБ диск поместится без проблем. То же самое мы могли бы сказать, что на диске объемом 4 ГБ есть место для 4000 МБ.

Аудио в формате MP3 занимает около 1 МБ в минуту. 20 часов, 60 минут/час, 20 * 60 дает 1200 минут. Это около 1200 МБ, что составляет 1,2 ГБ.

800 x 600 – это 480 000 пикселей. Каждый пиксель занимает 3 байта (по одному байту для красного/зеленого/синего), поэтому 480 000 * 3 — это всего 1 440 000 байт, т. е. около 1,4 МБ, что является пространством, необходимым для изображения в ОЗУ. Вы заметите, что на диске файлы .jpg занимают гораздо меньше места; это связано с "сжатием", которое является очень эффективным методом сокращения пространства для изображений и аудиоданных - тема будущего.

Альтернативный термин: Кибибайт Мебибайт Гибибайт Тебибайт

В компьютере удобно организовывать элементы в группы по степени двойки. Например, 2·10 равно 1024, поэтому программа может сгруппировать 1024 элемента вместе, как своего рода "круглое" число элементов в компьютере. Термин «килобайт» выше относится к этой группе размером 1024 вещи. Однако люди также группируют вещи по тысячам — 1 тысяча или 1 миллион элементов.

Я не очень хорошо разбираюсь в архитектуре ОЗУ и жестких дисков или в том, как электроника работает с фрагментами памяти, но это всегда вызывало мое любопытство: почему мы остановились на 8 битах для наименьшего элемента компьютерного значения?

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

Это потому, что 2^3 идеально подходит для адресации памяти? Электроника специально предназначена для хранения фрагментов из 8 бит? Если да, то почему бы не использовать более широкие слова? Это потому, что он делит 32, 64 и 128, поэтому процессорным словам может быть присвоено несколько из этих слов? Удобно ли иметь значение 256 для такого крошечного пространства?

Что вы думаете?

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

Что касается анекдота, я также думал о стандарте ASCII, в котором большинство первых символов бесполезны с такими вещами, как UTF-8, я также пытаюсь подумать о какой-нибудь более тонкой и быстрой кодировке символов.

10 ответов 10

Действительно, когда был придуман byte, он определялся как единица измерения от 1 до 6 бит. Используемые на протяжении всей истории размеры байтов включают 7, 9, 36 и машины с байтами переменного размера.

8 было сочетанием коммерческого успеха, достаточно удобного числа для людей, которые думали об этом (которые могли бы объединить друг друга), и, без сомнения, других причин, о которых я совершенно не знаю.

Упомянутый вами стандарт ASCII предполагает 7-битный байт и был основан на более ранних 6-битных стандартах связи.

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

Исторически байт — это размер, используемый для хранения символа. Этот вопрос, в свою очередь, основывается на практиках, стандартах и ​​стандартах де-факто, которые предшествовали использованию компьютеров для телекса и других методов связи, начиная, возможно, с Бодо в 1870 году. (Я не знаю ни одного более раннего, но готов к исправлениям).

Снова мы видим здесь разницу между C и C++, где int определяется с точки зрения размера слова, а long определяется для использования преимуществ процессора, который имеет концепцию «длинного слова», если таковая существует, хотя, возможно, они идентичны в терминах. данный случай к int . Минимальное и максимальное значения снова находятся в заголовке limit.h. (Действительно, с течением времени int может быть определен как меньший, чем естественный размер слова, как сочетание согласованности с тем, что распространено в других местах, сокращение использования памяти для массива int и, возможно, другие проблемы, которые я не понимаю. не знаю).

Следовательно, октет, байт и слово очень независимы друг от друга, несмотря на то, что отношение октет == байт и слово представляет собой целое число байтов (и целое двоичное округленное число, такое как 2, 4, 8 и т. д.). ) сегодня является обычным явлением.

Означает ли это, что 1 байт может содержать только один символ? Например:

и если у tiny int есть диапазон от 0 до 255, означает ли это, что его можно хранить с 255 символами?

что хранится

какой будет диапазон 0-10

Байт — это наименьшая единица данных в системе. Как правило, 1 байт = 1 символу ASCII. 2 байта = 1 символ UTF-16. Байт без знака может устареть от значений 0–255.

Посылка этого вопроса совершенно неверна. Байт не определяется как 8 бит, то есть октет. Байт — это наименьший адресный размер данных в архитектуре.

4 ответа 4

1 байт может содержать 1 символ. Например: обратитесь к значениям Ascii для каждого символа и преобразуйте их в двоичные. Вот как это работает.

Размер Tiny Int = 1 байт (от -128 до 127)

Int = 4 байта (от -2147483648 до 2147483647)

Да, 1 байт кодирует символ (включая пробелы и т. д.) из набора ASCII. Однако в единицах данных, предназначенных для кодировки символов, на практике может и часто требуется до 4 байтов. Это потому, что английский не единственный набор символов. И даже в англоязычных документах часто представлены другие языки и символы. Их очень много, и есть очень много других наборов кодировок, о которых вы, возможно, слышали, например. БИГ-5, УТФ-8, УТФ-32. Большинство компьютеров в настоящее время допускают такое использование и обеспечивают наименьшее количество искаженного текста (что обычно означает отсутствующий набор кодировок). 4 байта достаточно, чтобы покрыть эти возможные кодировки. I байт на символ не позволяет этого, и при использовании он часто превышает 4 байта на возможный символ для всех кодировок, а не только для ASCII. Окончательному символу может потребоваться только байт для работы или представления на экране, но для этого требуется, чтобы 4 байта были расположены в довольно обширной глобальной кодировке «работает».

Ваши баллы действительны, но я думаю, что вы путаете английский алфавит с английскими буквами. (Я думаю, что английский язык несколько уникален тем, что «Алфавит» не перечисляет все его буквы, не говоря уже обо всех их компьютеризированных формах символов.)

2^8 = 256 символов. Символ в двоичном формате — это последовательность из 8 (0 или 1).

Я считаю, что существует путаница, что 1 байт может содержать 256 символов - это не может, а скорее, что 1 символ может иметь 256 опций/вариаций/символов (a,b,c или. ) - если только символ использует 1 байт. Если для этого требуется больше байтов, таких как юникод, тогда это позволит использовать больше параметров символов, что, конечно же, требует юникод. Точно так же, как 1 байт может содержать 256 «параметров», вы можете хранить любое число от 0 до 255 в 1 байте как одно число, но это не означает, что вы получите 255 различных чисел.

Читайте также: