Слово безусловно может храниться в файле размером в байты, кавычки не учитываются при расчетах
Обновлено: 21.11.2024
Если вы загружаете много программ и файлов из Интернета, вы, вероятно, уже сталкивались с ZIP-файлами. Эта система сжатия является очень удобным изобретением, особенно для веб-пользователей, потому что она позволяет уменьшить общее количество битов и байтов в файле, чтобы его можно было передавать быстрее по более медленным интернет-соединениям или занимать меньше места на диске. Как только вы загрузите файл, ваш компьютер использует программу, такую как WinZip или Stuffit, чтобы увеличить файл до исходного размера. Если все работает правильно, расширенный файл идентичен исходному файлу до сжатия.
На первый взгляд это кажется очень загадочным. Как вы можете уменьшить количество битов и байтов, а затем добавить эти точные биты и байты позже? Как оказалось, основная идея этого процесса довольно проста. В этой статье мы рассмотрим этот простой метод, поскольку мы проходим через базовый процесс сжатия очень маленького файла.
Большинство типов компьютерных файлов достаточно избыточны — в них снова и снова содержится одна и та же информация. Программы сжатия файлов просто избавляются от избыточности. Вместо того, чтобы перечислять часть информации снова и снова, программа сжатия файлов перечисляет эту информацию один раз, а затем обращается к ней всякий раз, когда она появляется в исходной программе.
В качестве примера давайте рассмотрим тип информации, с которым мы все знакомы: слова.
В инаугурационной речи Джона Ф. Кеннеди в 1961 году он произнес эту знаменитую фразу:
Цитата состоит из 17 слов, состоящих из 61 буквы, 16 пробелов, одного тире и одной точки. Если каждая буква, пробел или знак препинания занимают одну единицу памяти, мы получаем общий размер файла 79 единиц. Чтобы уменьшить размер файла, нам нужно искать избыточность.
Сразу же мы замечаем, что:
- "спросить" появляется два раза
- "что" встречается два раза
- "ваш" встречается два раза
- "страна" встречается два раза
- "can" встречается два раза
- слово "делать" встречается два раза
- "for" встречается два раза
- "вы" встречается два раза
Игнорируя разницу между заглавными и строчными буквами, примерно половина фразы является избыточной. Девять слов — спросить, а не, что, ваша, страна, может, сделать, для вас — дают нам почти все, что нам нужно для всей цитаты. Чтобы построить вторую половину фразы, мы просто указываем на слова в первой половине и расставляем пробелы и знаки препинания.
В следующем разделе мы более подробно рассмотрим, как системы сжатия файлов справляются с избыточностью.
Избыточность и алгоритмы
Большинство программ сжатия используют разновидность адаптивного алгоритма LZ на основе словаря для сжатия файлов. «LZ» относится к Лемпелю и Зиву, создателям алгоритма, а «словарь» относится к методу каталогизации фрагментов данных.
Система упорядочивания словарей может быть разной, но она может быть такой же простой, как нумерованный список. Когда мы просматриваем знаменитые слова Кеннеди, мы выбираем повторяющиеся слова и помещаем их в пронумерованный указатель. Затем мы просто пишем число, а не все слово.
Итак, если это наш словарь:
Наше предложение теперь звучит так: "1 не 2 3 4 5 6 7 8 -- 1 2 8 5 6 7 3 4"
Если бы вы знали систему, вы могли бы легко восстановить исходную фразу, используя только этот словарь и числовой шаблон. Это то, что делает программа расширения на вашем компьютере, когда она расширяет загруженный файл. Вы также могли столкнуться с сжатыми файлами, которые открываются сами по себе. Чтобы создать такой файл, программист включает простую программу расширения со сжатым файлом. Он автоматически восстанавливает исходный файл после его загрузки.
Но сколько места мы на самом деле сэкономили с помощью этой системы? «1 не 2 3 4 5 6 7 8 -- 1 2 8 5 6 7 3 4» определенно короче, чем «Не спрашивай, что твоя страна может сделать для тебя, спроси, что ты можешь сделать для своей страны»; но имейте в виду, что нам нужно сохранить сам словарь вместе с файлом.
В реальной схеме сжатия выяснить различные требования к файлам было бы довольно сложно; но для наших целей давайте вернемся к идее, что каждый символ и каждый пробел занимают одну единицу памяти. Мы уже видели, что полная фраза занимает 79 единиц. Наше сжатое предложение (включая пробелы) занимает 37 единиц, и словарь (слова и числа) также занимает 37 единиц. Это дает нам размер файла 74, поэтому мы не сильно уменьшили размер файла.
Но это только одно предложение! Вы можете себе представить, что если программа сжатия проработает остальную часть речи Кеннеди, она обнаружит, что эти и другие слова повторяются еще много раз. И, как мы увидим в следующем разделе, он также будет переписывать словарь, чтобы получить максимально эффективную организацию.
Поиск закономерностей
В нашем предыдущем примере мы выбрали все повторяющиеся слова и поместили их в словарь. Для нас это самый очевидный способ написать словарь. Но программа сжатия видит это совсем по-другому: у нее нет концепции отдельных слов — она только ищет шаблоны. А чтобы максимально уменьшить размер файла, он тщательно отбирает шаблоны для включения в словарь.
Если мы подойдем к фразе с этой точки зрения, мы получим совершенно другой словарь.
Если программа сжатия просканирует фразу Кеннеди, первая избыточность, которую она обнаружит, будет состоять всего из пары букв. В «не спрашивай, что у тебя» повторяется буква «т», за которой следует пробел — в «не» и «что». Если бы программа сжатия записывала это в словарь, она могла бы записывать «1» каждый раз, когда за «t» следует пробел. Но в этой короткой фразе этого паттерна недостаточно, чтобы сделать его стоящей записью, поэтому программа в конечном итоге перезапишет его.
Следующее, что программа может заметить, это "ou", которое появляется как в "your", так и в "country". Если бы это был более длинный документ, запись этого шаблона в словарь могла бы сэкономить много места — «ou» — довольно распространенная комбинация в английском языке. Но по мере того, как программа сжатия работала над этим предложением, она быстро находила лучший выбор для словарной статьи: повторяется не только «ou», но и все слова «your» и «country» повторяются, и они действительно повторяются. вместе, как фраза "ваша страна". В этом случае программа перезапишет словарную запись для «ou» записью для «вашей страны».
Независимо от того, какой именно метод вы используете, эта система углубленного поиска позволяет сжимать файл намного эффективнее, чем если бы вы просто выбирали слова. Используя шаблоны, которые мы выбрали выше, и добавив «__» вместо пробелов, мы получаем этот большой словарь:
И это предложение меньшего размера: "1not__2345__--__12354"
Предложение теперь занимает 18 единиц памяти, а наш словарь занимает 41 единицу. Таким образом, мы сжали общий размер файла с 79 единиц до 59 единиц! Это всего лишь один из способов сжатия фразы, и не обязательно самый эффективный. (Посмотрите, сможете ли вы найти лучший способ!)
Насколько хороша эта система? Коэффициент сжатия файла зависит от ряда факторов, включая тип файла, размер файла и схему сжатия.
В большинстве языков мира определенные буквы и слова часто встречаются вместе в одном и том же образце. Из-за такого высокого уровня избыточности текстовые файлы очень хорошо сжимаются. Сокращение на 50 процентов и более типично для текстового файла хорошего размера. Большинство языков программирования также очень избыточны, потому что они используют относительно небольшой набор команд, которые часто идут вместе в заданном шаблоне. Файлы, содержащие много уникальной информации, такие как графические файлы или файлы MP3, не могут быть сильно сжаты с помощью этой системы, поскольку они не повторяют множество шаблонов (подробнее об этом в следующем разделе).
Если в файле много повторяющихся шаблонов, скорость уменьшения обычно увеличивается с увеличением размера файла. Вы можете убедиться в этом, просто взглянув на наш пример — если бы у нас было больше речи Кеннеди, мы могли бы чаще обращаться к шаблонам в нашем словаре и, таким образом, получить больше от файлового пространства каждой записи. Кроме того, в более длительной работе могут появиться более всеобъемлющие шаблоны, что позволит нам создать более эффективный словарь.
Эта эффективность также зависит от конкретного алгоритма, используемого программой сжатия. Некоторые программы особенно подходят для обнаружения шаблонов в определенных типах файлов и поэтому могут сжимать их более кратко. У других есть словари внутри словарей, которые могут эффективно сжиматься для больших файлов, но не для меньших. Хотя все программы сжатия такого рода работают с одной и той же основной идеей, на самом деле существует много различий в способах выполнения. Программисты всегда пытаются создать лучшую систему.
Сжатие с потерями и без потерь
Тип сжатия, который мы здесь обсуждаем, называется сжатием без потерь, поскольку он позволяет точно воссоздать исходный файл. Все сжатие без потерь основано на идее разбиения файла на «меньшую» форму для передачи или хранения, а затем на другом конце, чтобы его можно было использовать снова.
Сжатие с потерями работает совсем по-другому. Эти программы просто удаляют «ненужные» биты информации, подгоняя файл под размер. Этот тип сжатия часто используется для уменьшения размера файла растровых изображений, которые имеют тенденцию быть довольно громоздкими. Чтобы понять, как это работает, давайте рассмотрим, как ваш компьютер может сжать отсканированную фотографию.
Программа сжатия без потерь мало что может сделать с этим типом файлов.Хотя большие части изображения могут выглядеть одинаково — например, все небо синее — большинство отдельных пикселей немного отличаются. Чтобы уменьшить это изображение без ущерба для разрешения, вы должны изменить значение цвета для определенных пикселей. Если бы на картинке было много синего неба, программа выбирала бы один цвет синего, который можно было бы использовать для каждого пикселя. Затем программа перезаписывает файл так, чтобы значение для каждого пикселя неба ссылалось на эту информацию. Если схема сжатия работает хорошо, вы не заметите изменения, но размер файла значительно уменьшится.
Конечно, при сжатии с потерями вы не сможете восстановить исходный файл после его сжатия. Вы застряли с переинтерпретацией оригинала программой сжатия. По этой причине вы не можете использовать этот тип сжатия для всего, что необходимо точно воспроизвести, включая программные приложения, базы данных и речи на инаугурации президента.
Дополнительную информацию о сжатии файлов и связанных темах см. по ссылкам на следующей странице.
PostgreSQL имеет богатый набор собственных типов данных, доступных пользователям. Пользователи могут добавлять новые типы в PostgreSQL с помощью команды CREATE TYPE.
Имя | Псевдонимы | Описание | bigint | int8 | 8-байтовое целое число со знаком |
---|---|---|
bigserial | serial8 | автоинкремент восьмибайтового целого числа |
bit [ (n) ] | битовая строка фиксированной длины | |
< tt>bit Variing [ (n) ] | varbit | битовая строка переменной длины |
логическое значение | логическое значение | логическое логическое значение (true/false) td> |
коробка | прямоугольная коробка в плоскости | |
bytea | бинарные данные ("массив байтов") | |
переменный символ [ (n) ] | varchar [ (n) ] | строка символов переменной длины |
символ [ (n) ] | символ [ (n) ] | символ фиксированной длины строка действия |
cidr | сетевой адрес IPv4 или IPv6 | |
круг | круг в плоскости | |
дата | календарная дата (год, месяц, день) | |
двойная точность | float8 | < td>число двойной точности с плавающей запятой|
inet | адрес хоста IPv4 или IPv6 | |
integer | int, int4 | четырехбайтовое целое число со знаком |
интервал [ (p) ] | промежуток времени | |
линия | бесконечная линия в плоскости | |
lseg< /td> | отрезок линии в плоскости | |
macaddr | MAC-адрес | |
деньги | сумма в валюте | |
числовой [ (p, s) ] | десятичный [ (p, s) ] tt> | точное числовое значение выбираемого p разрез |
путь | геометрический путь на плоскости | |
< tt>точка | геометрическая точка на плоскости | |
многоугольник | замкнутая геометрическая путь в плоскости | |
real | float4 | одинарная точность число с плавающей запятой |
smallint | int2 | со знаком два -byte integer |
serial | serial4 | автоинкремент четыре- byte integer |
текст | строка символов переменной длины | |
время [ (p) ] [ без часового пояса ] | время суток | |
< tt>time [ (p) ] с часовым поясом | timetz | время суток, включая время зона |
метка времени [ (p) ] [без часового пояса ] | дата и время | |
метка времени [ (p) ] с указанием часового пояса< /tt> | timestamptz | дата и время, включая часовой пояс |
Каждый тип данных имеет внешнее представление, определяемое входными и выходными функциями. Многие из встроенных типов имеют очевидные внешние форматы. Однако некоторые типы либо уникальны для PostgreSQL, например геометрические пути, либо имеют несколько возможных форматов, например типы даты и времени. Некоторые входные и выходные функции необратимы. То есть результат функции вывода может потерять точность по сравнению с исходным вводом.
Имя | Размер хранилища | Описание | Диапазон |
---|---|---|---|
smallint | 2 байта | целое число малого диапазона | - от 32768 до +32767 |
целое число | 4 байта | обычный выбор для целого числа | -2147483648 до +2147483647 |
bigint | 8 байт | целое число большого диапазона | -9223372036854775808 до 9223372036854775807 |
десятичное число | переменная | user- указанная точность, точная | без ограничений |
числовой | переменная | указанная пользователем точность, точная | без ограничений |
реальная | 4 байта | переменная-точность, неточная | 6 десятичных цифр |
двойная точность | 8 байты | переменная-точность, неточная | 15 десятичных цифр |
последовательный | 4 байта | автоинкрементное целое | от 1 до 2147483647 |
bigserial | 8 байт | большое автоинкрементное целое | от 1 до 9223372036854775807 |
Синтаксис констант для числовых типов описан в Разделе 4.1.2. Числовые типы имеют полный набор соответствующих арифметических операторов и функций. Обратитесь к главе 9 для получения дополнительной информации. В следующих разделах подробно описаны типы.
8.1.1. Целочисленные типы
Типы smallint, integer и bigint хранят целые числа, т. е. числа без дробных частей, различных диапазонов. Попытки сохранить значения за пределами допустимого диапазона приведут к ошибке.
Обычно выбирается тип integer, так как он предлагает наилучший баланс между диапазоном, размером хранилища и производительностью. Тип smallint обычно используется, только если дисковое пространство ограничено. Тип bigint следует использовать только в том случае, если диапазона integer недостаточно, поскольку последний определенно быстрее.
Тип bigint может работать некорректно на всех платформах, поскольку он зависит от поддержки компилятором восьмибайтовых целых чисел. На машине без такой поддержки bigint действует так же, как integer (но по-прежнему занимает восемь байт памяти). Однако мы не знаем ни одной разумной платформы, на которой это действительно так.
8.1.2. Числа произвольной точности
Тип numeric может хранить числа с точностью до 1000 знаков и точно выполнять вычисления. Особенно рекомендуется для хранения денежных сумм и других величин, где требуется точность. Однако арифметические операции над числовыми значениями выполняются очень медленно по сравнению с целочисленными типами или типами с плавающей запятой, описанными в следующем разделе.
В дальнейшем мы используем следующие термины: масштаб числового – это количество десятичных цифр в дробной части справа от десятичной точки. Точность числового – это общее количество значащих цифр в целом числе, то есть количество цифр по обе стороны от десятичной точки. Таким образом, число 23,5141 имеет точность 6 и масштаб 4. Можно считать, что целые числа имеют нулевой масштаб.
Можно настроить как максимальную точность, так и максимальный масштаб столбца numeric. Чтобы объявить столбец типа numeric, используйте синтаксис
Точность должна быть положительной, шкала нулевой или положительной. В качестве альтернативы
выбирает масштаб 0. Указание
без какой-либо точности или масштаба создает столбец, в котором могут храниться числовые значения любой точности и масштаба, вплоть до предела точности реализации. Столбец такого типа не будет приводить входные значения к какому-либо конкретному масштабу, тогда как числовые столбцы с объявленным масштабом будут приводить входные значения к этому масштабу. (Стандарт SQL требует шкалы по умолчанию, равной 0, т. е. приведения к целочисленной точности. Мы считаем это немного бесполезным. Если вас беспокоит переносимость, всегда указывайте точность и масштаб явно.)
Если масштаб сохраняемого значения больше заявленного масштаба столбца, система округлит значение до указанного количества дробных цифр. Затем, если количество цифр слева от десятичной точки превышает заявленную точность минус заявленный масштаб, возникает ошибка.
Числовые значения физически хранятся без дополнительных нулей в начале или в конце. Таким образом, заявленная точность и масштаб столбца являются максимальными, а не фиксированными выделениями. (В этом смысле тип numeric больше похож на varchar(n), чем на char(n).) Фактические требования к памяти составляют два байта для каждой группы из четырех десятичных цифр плюс восемь байтов служебных данных.
Помимо обычных числовых значений, тип numeric допускает использование специального значения NaN, означающего "не-число" . Любая операция над NaN дает другой NaN. Записывая это значение как константу в команде SQL, вы должны заключить его в кавычки, например, UPDATE table SET x = 'NaN'. При вводе строка NaN распознается без учета регистра.
Типы десятичный и числовой эквивалентны. Оба типа являются частью стандарта SQL.
8.1.3. Типы с плавающей запятой
Неточные значения означают, что некоторые значения не могут быть точно преобразованы во внутренний формат и сохраняются как приблизительные значения, поэтому сохранение и распечатка значений могут показывать небольшие расхождения. Управление этими ошибками и то, как они распространяются в вычислениях, является предметом целой области математики и компьютерных наук и не будет здесь обсуждаться далее, за исключением следующих моментов:
Если вам требуется точное хранение и расчеты (например, для денежных сумм), используйте вместо этого тип numeric.
Если вы хотите выполнять сложные вычисления с этими типами для чего-то важного, особенно если вы полагаетесь на определенное поведение в граничных случаях (бесконечность, потеря значимости), вам следует тщательно оценить реализацию.
Сравнение двух значений с плавающей запятой на равенство может работать, а может и не работать должным образом.
На большинстве платформ тип real имеет диапазон от 1E-37 до 1E+37 с точностью не менее 6 знаков после запятой. Тип двойной точности обычно имеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр. Слишком большие или слишком маленькие значения вызовут ошибку. Округление может иметь место, если точность введенного числа слишком высока. Слишком близкие к нулю числа, которые не могут быть представлены как отличные от нуля, вызовут ошибку потери значимости.
Помимо обычных числовых значений, типы с плавающей запятой имеют несколько специальных значений:
Они представляют собой специальные значения IEEE 754 "бесконечность" , "отрицательная бесконечность" и "не-число" соответственно. (На машине, арифметика с плавающей запятой которой не соответствует IEEE 754, эти значения, вероятно, не будут работать должным образом.) При записи этих значений как констант в команде SQL вы должны заключать их в кавычки, например UPDATE table УСТАНОВИТЕ x = 'Бесконечность'. При вводе эти строки распознаются без учета регистра.
PostgreSQL также поддерживает стандартные для SQL нотации float и float(p) для указания неточных числовых типов. Здесь p указывает минимально допустимую точность двоичных цифр. PostgreSQL принимает float(1) в float(24) как выбор типа real, тогда как float(25) для float(53) выберите двойную точность. Значения p за пределами допустимого диапазона вызывают ошибку. float без указания точности означает двойную точность.
Примечание. До PostgreSQL 7.4 точность в float(p) означала столько-то десятичных цифр. Это было исправлено, чтобы соответствовать стандарту SQL, который указывает, что точность измеряется в двоичных цифрах. Предположение, что real и двойная точность имеют ровно 24 и 53 бита в мантиссе соответственно, верно для реализаций с плавающей запятой стандарта IEEE. На платформах, отличных от IEEE, он может немного отличаться, но для простоты на всех платформах используются одни и те же диапазоны p.
8.1.4. Серийные типы
Типы данных serial и bigserial не являются истинными типами, а являются просто удобными обозначениями для настройки столбцов уникальных идентификаторов (аналогично AUTO_INCREMENT свойство, поддерживаемое некоторыми другими базами данных). В текущей реализации указание
эквивалентно указанию:
Таким образом, мы создали целочисленный столбец и настроили его значения по умолчанию, которые будут назначаться из генератора последовательности. Ограничение NOT NULL применяется, чтобы гарантировать, что нулевое значение не может быть вставлено явно. В большинстве случаев вы также захотите добавить ограничение UNIQUE или PRIMARY KEY, чтобы предотвратить случайную вставку повторяющихся значений, но это не происходит автоматически.
Примечание. До PostgreSQL 7.3 serial подразумевал UNIQUE. Это уже не автомат. Если вы хотите, чтобы последовательный столбец находился в уникальном ограничении или первичном ключе, теперь его необходимо указать, как и любой другой тип данных.
Чтобы вставить следующее значение последовательности в столбец serial, укажите, что столбцу serial должно быть присвоено значение по умолчанию. Это можно сделать либо путем исключения столбца из списка столбцов в операторе INSERT, либо с помощью ключевого слова DEFAULT.
Имена типов serial и serial4 эквивалентны: оба создают столбцы integer. Имена типов bigserial и serial8 работают точно так же, за исключением того, что они создают столбец bigint. bigserial следует использовать, если предполагается использование более 2 31 идентификаторов за время существования таблицы.
Последовательность, созданная для столбца serial, автоматически удаляется при удалении столбца-владельца и не может быть удалена в противном случае. (Это было не так в выпусках PostgreSQL до 7.3. Обратите внимание, что это автоматическое связывание не будет происходить для последовательности, созданной путем перезагрузки дампа из базы данных до 7.3; файл дампа не содержит информации, необходимой для установления связи зависимости. ) Кроме того, эта зависимость между последовательностью и столбцом создается только для самого столбца serial. Если какие-либо другие столбцы ссылаются на последовательность (возможно, путем ручного вызова функции nextval), они будут разорваны, если последовательность будет удалена. Такое использование последовательности столбцов serial считается дурным тоном; если вы хотите передать несколько столбцов из одного и того же генератора последовательности, создайте последовательность как независимый объект.
Если вы загружаете много программ и файлов из Интернета, вы, вероятно, уже сталкивались с ZIP-файлами. Эта система сжатия является очень удобным изобретением, особенно для веб-пользователей, потому что она позволяет уменьшить общее количество битов и байтов в файле, чтобы его можно было передавать быстрее по более медленным интернет-соединениям или занимать меньше места на диске. Как только вы загрузите файл, ваш компьютер использует программу, такую как WinZip или Stuffit, чтобы увеличить файл до исходного размера. Если все работает правильно, расширенный файл идентичен исходному файлу до сжатия.
На первый взгляд это кажется очень загадочным. Как вы можете уменьшить количество битов и байтов, а затем добавить эти точные биты и байты позже? Как оказалось, основная идея этого процесса довольно проста. В этой статье мы рассмотрим этот простой метод, поскольку мы проходим через базовый процесс сжатия очень маленького файла.
Большинство типов компьютерных файлов достаточно избыточны — в них снова и снова содержится одна и та же информация. Программы сжатия файлов просто избавляются от избыточности. Вместо того, чтобы перечислять часть информации снова и снова, программа сжатия файлов перечисляет эту информацию один раз, а затем обращается к ней всякий раз, когда она появляется в исходной программе.
В качестве примера давайте рассмотрим тип информации, с которым мы все знакомы: слова.
В инаугурационной речи Джона Ф. Кеннеди в 1961 году он произнес эту знаменитую фразу:
Цитата состоит из 17 слов, состоящих из 61 буквы, 16 пробелов, одного тире и одной точки. Если каждая буква, пробел или знак препинания занимают одну единицу памяти, мы получаем общий размер файла 79 единиц. Чтобы уменьшить размер файла, нам нужно искать избыточность.
Сразу же мы замечаем, что:
- "спросить" появляется два раза
- "что" встречается два раза
- "ваш" встречается два раза
- "страна" встречается два раза
- "can" встречается два раза
- слово "делать" встречается два раза
- "for" встречается два раза
- "вы" встречается два раза
Игнорируя разницу между заглавными и строчными буквами, примерно половина фразы является избыточной. Девять слов — спросить, а не, что, ваша, страна, может, сделать, для вас — дают нам почти все, что нам нужно для всей цитаты. Чтобы построить вторую половину фразы, мы просто указываем на слова в первой половине и расставляем пробелы и знаки препинания.
В следующем разделе мы более подробно рассмотрим, как системы сжатия файлов справляются с избыточностью.
Избыточность и алгоритмы
Большинство программ сжатия используют разновидность адаптивного алгоритма LZ на основе словаря для сжатия файлов. «LZ» относится к Лемпелю и Зиву, создателям алгоритма, а «словарь» относится к методу каталогизации фрагментов данных.
Система упорядочивания словарей может быть разной, но она может быть такой же простой, как нумерованный список. Когда мы просматриваем знаменитые слова Кеннеди, мы выбираем повторяющиеся слова и помещаем их в пронумерованный указатель. Затем мы просто пишем число, а не все слово.
Итак, если это наш словарь:
Наше предложение теперь звучит так: "1 не 2 3 4 5 6 7 8 -- 1 2 8 5 6 7 3 4"
Если бы вы знали систему, вы могли бы легко восстановить исходную фразу, используя только этот словарь и числовой шаблон. Это то, что делает программа расширения на вашем компьютере, когда она расширяет загруженный файл. Вы также могли столкнуться с сжатыми файлами, которые открываются сами по себе. Чтобы создать такой файл, программист включает простую программу расширения со сжатым файлом. Он автоматически восстанавливает исходный файл после его загрузки.
Но сколько места мы на самом деле сэкономили с помощью этой системы? «1 не 2 3 4 5 6 7 8 -- 1 2 8 5 6 7 3 4» определенно короче, чем «Не спрашивай, что твоя страна может сделать для тебя, спроси, что ты можешь сделать для своей страны»; но имейте в виду, что нам нужно сохранить сам словарь вместе с файлом.
В реальной схеме сжатия выяснить различные требования к файлам было бы довольно сложно; но для наших целей давайте вернемся к идее, что каждый символ и каждый пробел занимают одну единицу памяти. Мы уже видели, что полная фраза занимает 79 единиц. Наше сжатое предложение (включая пробелы) занимает 37 единиц, и словарь (слова и числа) также занимает 37 единиц. Это дает нам размер файла 74, поэтому мы не сильно уменьшили размер файла.
Но это только одно предложение! Вы можете себе представить, что если программа сжатия проработает остальную часть речи Кеннеди, она обнаружит, что эти и другие слова повторяются еще много раз. И, как мы увидим в следующем разделе, он также будет переписывать словарь, чтобы получить максимально эффективную организацию.
Поиск закономерностей
В нашем предыдущем примере мы выбрали все повторяющиеся слова и поместили их в словарь. Для нас это самый очевидный способ написать словарь. Но программа сжатия видит это совсем по-другому: у нее нет концепции отдельных слов — она только ищет шаблоны. А чтобы максимально уменьшить размер файла, он тщательно отбирает шаблоны для включения в словарь.
Если мы подойдем к фразе с этой точки зрения, мы получим совершенно другой словарь.
Если программа сжатия просканирует фразу Кеннеди, первая избыточность, которую она обнаружит, будет состоять всего из пары букв. В «не спрашивай, что у тебя» повторяется буква «т», за которой следует пробел — в «не» и «что». Если бы программа сжатия записывала это в словарь, она могла бы записывать «1» каждый раз, когда за «t» следует пробел. Но в этой короткой фразе этого паттерна недостаточно, чтобы сделать его стоящей записью, поэтому программа в конечном итоге перезапишет его.
Следующее, что программа может заметить, это "ou", которое появляется как в "your", так и в "country". Если бы это был более длинный документ, запись этого шаблона в словарь могла бы сэкономить много места — «ou» — довольно распространенная комбинация в английском языке. Но по мере того, как программа сжатия работала над этим предложением, она быстро находила лучший выбор для словарной статьи: повторяется не только «ou», но и все слова «your» и «country» повторяются, и они действительно повторяются. вместе, как фраза "ваша страна". В этом случае программа перезапишет словарную запись для «ou» записью для «вашей страны».
Независимо от того, какой именно метод вы используете, эта система углубленного поиска позволяет сжимать файл намного эффективнее, чем если бы вы просто выбирали слова. Используя шаблоны, которые мы выбрали выше, и добавив «__» вместо пробелов, мы получаем этот большой словарь:
И это предложение меньшего размера: "1not__2345__--__12354"
Предложение теперь занимает 18 единиц памяти, а наш словарь занимает 41 единицу. Таким образом, мы сжали общий размер файла с 79 единиц до 59 единиц! Это всего лишь один из способов сжатия фразы, и не обязательно самый эффективный. (Посмотрите, сможете ли вы найти лучший способ!)
Насколько хороша эта система? Коэффициент сжатия файла зависит от ряда факторов, включая тип файла, размер файла и схему сжатия.
В большинстве языков мира определенные буквы и слова часто встречаются вместе в одном и том же образце. Из-за такого высокого уровня избыточности текстовые файлы очень хорошо сжимаются. Сокращение на 50 процентов и более типично для текстового файла хорошего размера. Большинство языков программирования также очень избыточны, потому что они используют относительно небольшой набор команд, которые часто идут вместе в заданном шаблоне. Файлы, содержащие много уникальной информации, такие как графические файлы или файлы MP3, не могут быть сильно сжаты с помощью этой системы, поскольку они не повторяют множество шаблонов (подробнее об этом в следующем разделе).
Если в файле много повторяющихся шаблонов, скорость уменьшения обычно увеличивается с увеличением размера файла. Вы можете убедиться в этом, просто взглянув на наш пример — если бы у нас было больше речи Кеннеди, мы могли бы чаще обращаться к шаблонам в нашем словаре и, таким образом, получить больше от файлового пространства каждой записи. Кроме того, в более длительной работе могут появиться более всеобъемлющие шаблоны, что позволит нам создать более эффективный словарь.
Эта эффективность также зависит от конкретного алгоритма, используемого программой сжатия. Некоторые программы особенно подходят для обнаружения шаблонов в определенных типах файлов и поэтому могут сжимать их более кратко. У других есть словари внутри словарей, которые могут эффективно сжиматься для больших файлов, но не для меньших.Хотя все программы сжатия такого рода работают с одной и той же основной идеей, на самом деле существует много различий в способах выполнения. Программисты всегда пытаются создать лучшую систему.
Сжатие с потерями и без потерь
Тип сжатия, который мы здесь обсуждаем, называется сжатием без потерь, поскольку он позволяет точно воссоздать исходный файл. Все сжатие без потерь основано на идее разбиения файла на «меньшую» форму для передачи или хранения, а затем на другом конце, чтобы его можно было использовать снова.
Сжатие с потерями работает совсем по-другому. Эти программы просто удаляют «ненужные» биты информации, подгоняя файл под размер. Этот тип сжатия часто используется для уменьшения размера файла растровых изображений, которые имеют тенденцию быть довольно громоздкими. Чтобы понять, как это работает, давайте рассмотрим, как ваш компьютер может сжать отсканированную фотографию.
Программа сжатия без потерь мало что может сделать с этим типом файлов. Хотя большие части изображения могут выглядеть одинаково — например, все небо синее — большинство отдельных пикселей немного отличаются. Чтобы уменьшить это изображение без ущерба для разрешения, вы должны изменить значение цвета для определенных пикселей. Если бы на картинке было много синего неба, программа выбирала бы один цвет синего, который можно было бы использовать для каждого пикселя. Затем программа перезаписывает файл так, чтобы значение для каждого пикселя неба ссылалось на эту информацию. Если схема сжатия работает хорошо, вы не заметите изменения, но размер файла значительно уменьшится.
Конечно, при сжатии с потерями вы не сможете восстановить исходный файл после его сжатия. Вы застряли с переинтерпретацией оригинала программой сжатия. По этой причине вы не можете использовать этот тип сжатия для всего, что необходимо точно воспроизвести, включая программные приложения, базы данных и речи на инаугурации президента.
Дополнительную информацию о сжатии файлов и связанных темах см. по ссылкам на следующей странице.
PostgreSQL имеет богатый набор собственных типов данных, доступных пользователям. Пользователи могут добавлять новые типы в PostgreSQL с помощью команды CREATE TYPE.
Имя | Псевдонимы | Описание | bigint | int8 | 8-байтовое целое число со знаком |
---|---|---|
bigserial | serial8 | автоинкремент восьмибайтового целого числа |
bit [ (n) ] | битовая строка фиксированной длины | |
< tt>bit Variing [ (n) ] | varbit | битовая строка переменной длины |
логическое значение | логическое значение | логическое логическое значение (true/false) td> |
коробка | прямоугольная коробка в плоскости | |
bytea | бинарные данные ("массив байтов") | |
переменный символ [ (n) ] | varchar [ (n) ] | строка символов переменной длины |
символ [ (n) ] | символ [ (n) ] | символ фиксированной длины строка действия |
cidr | сетевой адрес IPv4 или IPv6 | |
круг | круг в плоскости | |
дата | календарная дата (год, месяц, день) | |
двойная точность | float8 | < td>число двойной точности с плавающей запятой|
inet | адрес хоста IPv4 или IPv6 | |
integer | int, int4 | четырехбайтовое целое число со знаком |
интервал [ (p) ] | промежуток времени | |
линия | бесконечная линия в плоскости | |
lseg< /td> | отрезок линии в плоскости | |
macaddr | MAC-адрес | |
деньги | сумма в валюте | |
числовой [ (p, s) ] | десятичный [ (p, s) ] tt> | точное числовое значение выбираемого p разрез |
путь | геометрический путь на плоскости | |
< tt>точка | геометрическая точка на плоскости | |
многоугольник | замкнутая геометрическая путь в плоскости | |
real | float4 | одинарная точность число с плавающей запятой |
smallint | int2 | со знаком два -byte integer |
serial | serial4 | автоинкремент четыре- byte integer |
текст | строка символов переменной длины | |
время [ (p) ] [ без часового пояса ] | время суток | |
< tt>time [ (p) ] с часовым поясом | timetz | время суток, включая время зона |
метка времени [ (p) ] [без часового пояса ] | дата и время | |
метка времени [ (p) ] с указанием часового пояса< /tt> | timestamptz | дата и время, включая часовой пояс |
Каждый тип данных имеет внешнее представление, определяемое входными и выходными функциями. Многие из встроенных типов имеют очевидные внешние форматы. Однако некоторые типы либо уникальны для PostgreSQL, например геометрические пути, либо имеют несколько возможных форматов, например типы даты и времени. Некоторые входные и выходные функции необратимы. То есть результат функции вывода может потерять точность по сравнению с исходным вводом.
Имя | Размер хранилища | Описание | Диапазон |
---|---|---|---|
smallint | 2 байта | целое число малого диапазона | - от 32768 до +32767 |
целое число | 4 байта | обычный выбор для целого числа | -2147483648 до +2147483647 |
bigint | 8 байт | целое число большого диапазона | -9223372036854775808 до 9223372036854775807 |
десятичное число | переменная | user- указанная точность, точная | без ограничений |
числовой | переменная | указанная пользователем точность, точная | без ограничений |
реальная | 4 байта | переменная-точность, неточная | 6 десятичных цифр |
двойная точность | 8 байты | переменная-точность, неточная | 15 десятичных цифр |
последовательный | 4 байта | автоинкрементное целое | от 1 до 2147483647 |
bigserial | 8 байт | большое автоинкрементное целое | от 1 до 9223372036854775807 |
Синтаксис констант для числовых типов описан в Разделе 4.1.2. Числовые типы имеют полный набор соответствующих арифметических операторов и функций.Обратитесь к главе 9 для получения дополнительной информации. В следующих разделах подробно описаны типы.
8.1.1. Целочисленные типы
Типы smallint, integer и bigint хранят целые числа, т. е. числа без дробных частей, различных диапазонов. Попытки сохранить значения за пределами допустимого диапазона приведут к ошибке.
Обычно выбирается тип integer, так как он предлагает наилучший баланс между диапазоном, размером хранилища и производительностью. Тип smallint обычно используется, только если дисковое пространство ограничено. Тип bigint следует использовать только в том случае, если диапазона integer недостаточно, поскольку последний определенно быстрее.
Тип bigint может работать некорректно на всех платформах, поскольку он зависит от поддержки компилятором восьмибайтовых целых чисел. На машине без такой поддержки bigint действует так же, как integer (но по-прежнему занимает восемь байт памяти). Однако мы не знаем ни одной разумной платформы, на которой это действительно так.
8.1.2. Числа произвольной точности
Тип numeric может хранить числа с точностью до 1000 знаков и точно выполнять вычисления. Особенно рекомендуется для хранения денежных сумм и других величин, где требуется точность. Однако арифметические операции над числовыми значениями выполняются очень медленно по сравнению с целочисленными типами или типами с плавающей запятой, описанными в следующем разделе.
В дальнейшем мы используем следующие термины: масштаб числового – это количество десятичных цифр в дробной части справа от десятичной точки. Точность числового – это общее количество значащих цифр в целом числе, то есть количество цифр по обе стороны от десятичной точки. Таким образом, число 23,5141 имеет точность 6 и масштаб 4. Можно считать, что целые числа имеют нулевой масштаб.
Можно настроить как максимальную точность, так и максимальный масштаб столбца numeric. Чтобы объявить столбец типа numeric, используйте синтаксис
Точность должна быть положительной, шкала нулевой или положительной. В качестве альтернативы
выбирает масштаб 0. Указание
без какой-либо точности или масштаба создает столбец, в котором могут храниться числовые значения любой точности и масштаба, вплоть до предела точности реализации. Столбец такого типа не будет приводить входные значения к какому-либо конкретному масштабу, тогда как числовые столбцы с объявленным масштабом будут приводить входные значения к этому масштабу. (Стандарт SQL требует шкалы по умолчанию, равной 0, т. е. приведения к целочисленной точности. Мы считаем это немного бесполезным. Если вас беспокоит переносимость, всегда указывайте точность и масштаб явно.)
Если масштаб сохраняемого значения больше заявленного масштаба столбца, система округлит значение до указанного количества дробных цифр. Затем, если количество цифр слева от десятичной точки превышает заявленную точность минус заявленный масштаб, возникает ошибка.
Числовые значения физически хранятся без дополнительных нулей в начале или в конце. Таким образом, заявленная точность и масштаб столбца являются максимальными, а не фиксированными выделениями. (В этом смысле тип numeric больше похож на varchar(n), чем на char(n).) Фактические требования к памяти составляют два байта для каждой группы из четырех десятичных цифр плюс восемь байтов служебных данных.
Помимо обычных числовых значений, тип numeric допускает использование специального значения NaN, означающего "не-число" . Любая операция над NaN дает другой NaN. Записывая это значение как константу в команде SQL, вы должны заключить его в кавычки, например, UPDATE table SET x = 'NaN'. При вводе строка NaN распознается без учета регистра.
Типы десятичный и числовой эквивалентны. Оба типа являются частью стандарта SQL.
8.1.3. Типы с плавающей запятой
Неточные значения означают, что некоторые значения не могут быть точно преобразованы во внутренний формат и сохраняются как приблизительные значения, поэтому сохранение и распечатка значений могут показывать небольшие расхождения. Управление этими ошибками и то, как они распространяются в вычислениях, является предметом целой области математики и компьютерных наук и не будет здесь обсуждаться далее, за исключением следующих моментов:
Если вам требуется точное хранение и расчеты (например, для денежных сумм), используйте вместо этого тип numeric.
Если вы хотите выполнять сложные вычисления с этими типами для чего-то важного, особенно если вы полагаетесь на определенное поведение в граничных случаях (бесконечность, потеря значимости), вам следует тщательно оценить реализацию.
Сравнение двух значений с плавающей запятой на равенство может работать, а может и не работать должным образом.
На большинстве платформ тип real имеет диапазон от 1E-37 до 1E+37 с точностью не менее 6 знаков после запятой. Тип двойной точности обычно имеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр. Слишком большие или слишком маленькие значения вызовут ошибку. Округление может иметь место, если точность введенного числа слишком высока. Слишком близкие к нулю числа, которые не могут быть представлены как отличные от нуля, вызовут ошибку потери значимости.
Помимо обычных числовых значений, типы с плавающей запятой имеют несколько специальных значений:
Они представляют собой специальные значения IEEE 754 "бесконечность" , "отрицательная бесконечность" и "не-число" соответственно. (На машине, арифметика с плавающей запятой которой не соответствует IEEE 754, эти значения, вероятно, не будут работать должным образом.) При записи этих значений как констант в команде SQL вы должны заключать их в кавычки, например UPDATE table УСТАНОВИТЕ x = 'Бесконечность'. При вводе эти строки распознаются без учета регистра.
PostgreSQL также поддерживает стандартные для SQL нотации float и float(p) для указания неточных числовых типов. Здесь p указывает минимально допустимую точность двоичных цифр. PostgreSQL принимает float(1) в float(24) как выбор типа real, тогда как float(25) для float(53) выберите двойную точность. Значения p за пределами допустимого диапазона вызывают ошибку. float без указания точности означает двойную точность.
Примечание. До PostgreSQL 7.4 точность в float(p) означала столько-то десятичных цифр. Это было исправлено, чтобы соответствовать стандарту SQL, который указывает, что точность измеряется в двоичных цифрах. Предположение, что real и двойная точность имеют ровно 24 и 53 бита в мантиссе соответственно, верно для реализаций с плавающей запятой стандарта IEEE. На платформах, отличных от IEEE, он может немного отличаться, но для простоты на всех платформах используются одни и те же диапазоны p.
8.1.4. Серийные типы
Типы данных serial и bigserial не являются истинными типами, а являются просто удобными обозначениями для настройки столбцов уникальных идентификаторов (аналогично AUTO_INCREMENT свойство, поддерживаемое некоторыми другими базами данных). В текущей реализации указание
эквивалентно указанию:
Таким образом, мы создали целочисленный столбец и настроили его значения по умолчанию, которые будут назначаться из генератора последовательности. Ограничение NOT NULL применяется, чтобы гарантировать, что нулевое значение не может быть вставлено явно. В большинстве случаев вы также захотите добавить ограничение UNIQUE или PRIMARY KEY, чтобы предотвратить случайную вставку повторяющихся значений, но это не происходит автоматически.
Примечание. До PostgreSQL 7.3 serial подразумевал UNIQUE. Это уже не автомат. Если вы хотите, чтобы последовательный столбец находился в уникальном ограничении или первичном ключе, теперь его необходимо указать, как и любой другой тип данных.
Чтобы вставить следующее значение последовательности в столбец serial, укажите, что столбцу serial должно быть присвоено значение по умолчанию. Это можно сделать либо путем исключения столбца из списка столбцов в операторе INSERT, либо с помощью ключевого слова DEFAULT.
Имена типов serial и serial4 эквивалентны: оба создают столбцы integer. Имена типов bigserial и serial8 работают точно так же, за исключением того, что они создают столбец bigint. bigserial следует использовать, если предполагается использование более 2 31 идентификаторов за время существования таблицы.
Последовательность, созданная для столбца serial, автоматически удаляется при удалении столбца-владельца и не может быть удалена в противном случае. (Это было не так в выпусках PostgreSQL до 7.3. Обратите внимание, что это автоматическое связывание не будет происходить для последовательности, созданной путем перезагрузки дампа из базы данных до 7.3; файл дампа не содержит информации, необходимой для установления связи зависимости. ) Кроме того, эта зависимость между последовательностью и столбцом создается только для самого столбца serial. Если какие-либо другие столбцы ссылаются на последовательность (возможно, путем ручного вызова функции nextval), они будут разорваны, если последовательность будет удалена. Такое использование последовательности столбцов serial считается дурным тоном; если вы хотите передать несколько столбцов из одного и того же генератора последовательности, создайте последовательность как независимый объект.
Руководство по чтению и импорту файлов Excel в R. Узнайте, как читать и импортировать файлы электронных таблиц с помощью базовых R и пакетов.
Как Excel связан с R?
Как многие из вас знают, Excel – это приложение для работы с электронными таблицами, разработанное Microsoft. Это легкодоступный инструмент для организации, анализа и хранения данных в таблицах, который широко используется во многих различных областях применения по всему миру. Неудивительно, что в R реализованы некоторые способы чтения, записи и управления файлами Excel (и электронными таблицами в целом).
В этом руководстве по чтению и импорту файлов Excel в R представлен обзор некоторых существующих вариантов импорта файлов Excel и электронных таблиц с различными расширениями в R. Рассматриваются как основные команды R, так и специальные пакеты. В то же время будут решены некоторые из наиболее распространенных проблем, с которыми вы можете столкнуться при загрузке файлов и электронных таблиц Excel в R.
Хотите погрузиться глубже? Ознакомьтесь с этим курсом DataCamp по импорту данных с помощью R, в котором есть глава об импорте данных Excel.
Шаги
Шаг пятый. Финальная проверка
После выполнения команды для чтения файла, в котором хранится ваш набор данных, вы можете в последний раз проверить, правильно ли вы импортировали файл.
Не забудьте ввести следующую команду, чтобы проверить типы данных атрибутов вашего набора данных:
Кроме того, вы также можете ввести:
Выполнив эту команду, вы увидите первые строки вашего фрейма данных. Это позволит вам проверить, правильно ли были разделены поля набора данных, не забыли ли вы указать или указать заголовок и т. д.
Обратите внимание, что вы можете добавить аргумент n к head(), чтобы указать количество строк фрейма данных, которые вы хотите вернуть, например: head(df, 5), чтобы вернуть первые пять строк фрейма данных df .< /p>
Шаг шестой. Туда и обратно
Импорт файлов – это всего лишь один небольшой, но важный шаг в работе с R. С этого момента вы готовы приступить к анализу, обработке или визуализации импортированных данных.
Хотите продолжить и начать работу с данными только что импортированного файла Excel? Ознакомьтесь с нашими руководствами по гистограммам и машинному обучению для начинающих.
Это руководство было написано в сотрудничестве с Йенсом Леерссеном, аналитиком качества данных, который увлечен решением проблем с качеством данных в крупных средах с разреженной документацией.
Читайте также: