Объём текста: алфавитный подход
Как посчитать «вес» текста, зная только размер алфавита и количество символов.
Представьте, что вы хотите передать SMS, сохранить курсовую или прикинуть, сколько места займёт книга. Во всех случаях возникает один и тот же вопрос: сколько информации содержит этот текст? Алфавитный подход даёт честный и простой ответ — он смотрит не на смысл слов, а только на то, из скольких разных символов составлен текст и сколько их всего.
Алфавитный (объёмный) подход измеряет информационный объём текста по количеству символов и мощности алфавита, не вдаваясь в смысл сообщения. Каждый символ несёт одинаковый вес, а весь объём — это вес одного символа, умноженный на их число.
Три величины, на которых всё держится
В алфавитном подходе работают всего три понятия. Запомните их обозначения — дальше всё будет крутиться вокруг них.
- N — мощность алфавита. Это количество разных символов, из которых можно составлять текст: буквы, цифры, знаки препинания, пробел. Например, если мы пишем только нулями и единицами, то N = 2.
- i — информационный вес одного символа (в битах). Сколько информации несёт один знак из такого алфавита.
- V — информационный объём всего текста. Сколько информации в сообщении целиком.
Вес одного символа: формула Хартли
Откуда берётся вес символа? Когда мы видим очередной знак, мы как бы «выбираем один из N равновозможных вариантов». Количество информации в таком выборе считается по формуле Хартли:
i = log₂ N — информационный вес одного символа алфавита мощностью N.
Обратная связь между ними так же важна: если известен вес символа, то размер алфавита равен N = 2ⁱ. Эти две формулы — две стороны одной монеты.
| Мощность алфавита N | Вес символа i = log₂ N | Пояснение |
|---|---|---|
| 2 | 1 бит | двоичный алфавит: 0 и 1 |
| 4 | 2 бита | 2² = 4 |
| 8 | 3 бита | 2³ = 8 |
| 16 | 4 бита | 2⁴ = 16 |
| 32 | 5 бит | примерно русские буквы без ё |
| 256 | 8 бит = 1 байт | 2⁸ = 256, кодировка ASCII |
Объём всего текста
Если каждый из K символов весит i бит, то весь текст весит просто их сумму:
V = K · i, где K — число символов в тексте (с пробелами и знаками), i — вес одного символа в битах.
Обратите внимание: при подсчёте K считаются все символы подряд, включая пробелы и повторы. Алфавитному подходу неважно, что буква «а» встретилась десять раз — каждое её появление несёт свои i бит.
Особый случай: N = 256
Число 256 встречается в задачах постоянно, и не случайно. Так как 2⁸ = 256, символ из такого алфавита весит ровно 8 бит = 1 байт. Это и есть классическая однобайтовая кодировка ASCII (точнее, её расширенные варианты на 256 знаков). Удобство в том, что объём в байтах тогда просто равен числу символов: 1 символ — 1 байт.
Worked example: считаем руками
Пусть алфавит содержит N = 32 символа, а в сообщении K = 140 символов. Найдём объём.
- Вес символа: i = log₂ 32 = 5 бит (потому что 2⁵ = 32).
- Объём текста: V = 140 · 5 = 700 бит.
- Переведём в байты: 700 ÷ 8 = 87,5 байта.
Теперь обратная задача. Сообщение заняло V = 1,5 Кбайта, в нём K = 1536 символов. Какой мощности алфавит использовался?
- Переведём объём в биты: 1,5 Кбайт = 1,5 · 1024 · 8 = 12288 бит.
- Вес одного символа: i = V ÷ K = 12288 ÷ 1536 = 8 бит.
- Мощность алфавита: N = 2⁸ = 256 символов.
Попробуйте сами: калькулятор объёма
Запустите код ниже. Функция text_volume принимает мощность алфавита и число символов, считает вес символа через math.log2 и печатает объём в битах и байтах. Поменяйте числа в вызовах и посмотрите, как меняется ответ.
import math
def text_volume(N, K):
"""Объём текста по алфавитному подходу."""
i = math.log2(N) # вес одного символа, бит
V_bits = K * i # объём в битах
V_bytes = V_bits / 8 # объём в байтах
print(f"N = {N}: вес символа i = {i:.0f} бит")
print(f"K = {K} символов -> {V_bits:.0f} бит = {V_bytes:.1f} байт")
return V_bits
# Пример 1: алфавит из 32 символов, 140 знаков
text_volume(32, 140)
print("---")
# Пример 2: ASCII (256 символов), 200 знаков
text_volume(256, 200)
Ожидаемый вывод:
N = 32: вес символа i = 5 бит K = 140 символов -> 700 бит = 87.5 байт --- N = 256: вес символа i = 8 бит K = 200 символов -> 1600 бит = 200.0 байт
Заметьте: во втором случае объём в байтах в точности равен числу символов — ровно потому, что один ASCII-символ весит 1 байт.
ASCII и Unicode: один символ — один или два байта
Сколько байт «стоит» символ, зависит от выбранной кодировки. Это напрямую меняет ответ задачи, поэтому условие всегда подсказывает, какой вес символа брать.
| Кодировка | Вес символа i | Мощность N | Где встречается |
|---|---|---|---|
| ASCII | 8 бит = 1 байт | 256 | латиница, цифры, базовые знаки |
| Unicode / UTF (в задачах) | 16 бит = 2 байта | 65536 | кириллица, эмодзи, любые алфавиты |
В школьных задачах договариваются: ASCII — это 1 байт на символ, а «кодировка Unicode» (часто пишут UTF-8 или UTF-16) — 2 байта на символ. Поэтому одно и то же слово из 5 символов займёт 5 байт в ASCII и 10 байт в Unicode.
Сравнение на одном примере
Слово «Привет!» состоит из K = 7 символов. Посчитаем объём в двух кодировках:
- ASCII (1 байт): V = 7 · 8 = 56 бит = 7 байт.
- Unicode (2 байта): V = 7 · 16 = 112 бит = 14 байт.
Кириллица обычно требует двухбайтового представления, поэтому реальный объём русского текста ближе ко второму варианту.
Частые ошибки
- Путают N и i. N — это сколько символов в алфавите, i — сколько бит весит один символ. Связь только через формулу i = log₂ N.
- Забывают пробелы и знаки препинания. В K входят все символы текста, а не только буквы.
- Теряют множитель 1024. При переводе в Кбайты делят на 1000 вместо 1024 — и получают неверный ответ.
- Не смотрят на кодировку. Для Unicode берут 1 байт вместо 2 и занижают объём вдвое.
Коротко
- Мощность алфавита N — число разных символов; вес символа i = log₂ N бит; обратно N = 2ⁱ.
- Объём текста V = K · i, где K — общее число символов (с пробелами).
- N = 256 даёт i = 8 бит = 1 байт — это ASCII, и тогда объём в байтах равен числу символов.
- В Unicode/UTF на символ обычно отводят 2 байта, поэтому объём вдвое больше, чем в ASCII.
- Переводы: 8 бит = 1 байт, 1024 байта = 1 Кбайт.