Объём текста: алфавитный подход

Как посчитать «вес» текста, зная только размер алфавита и количество символов.

Представьте, что вы хотите передать SMS, сохранить курсовую или прикинуть, сколько места займёт книга. Во всех случаях возникает один и тот же вопрос: сколько информации содержит этот текст? Алфавитный подход даёт честный и простой ответ — он смотрит не на смысл слов, а только на то, из скольких разных символов составлен текст и сколько их всего.

Алфавитный (объёмный) подход измеряет информационный объём текста по количеству символов и мощности алфавита, не вдаваясь в смысл сообщения. Каждый символ несёт одинаковый вес, а весь объём — это вес одного символа, умноженный на их число.

Три величины, на которых всё держится

В алфавитном подходе работают всего три понятия. Запомните их обозначения — дальше всё будет крутиться вокруг них.

  • N — мощность алфавита. Это количество разных символов, из которых можно составлять текст: буквы, цифры, знаки препинания, пробел. Например, если мы пишем только нулями и единицами, то N = 2.
  • i — информационный вес одного символа (в битах). Сколько информации несёт один знак из такого алфавита.
  • V — информационный объём всего текста. Сколько информации в сообщении целиком.

Вес одного символа: формула Хартли

Откуда берётся вес символа? Когда мы видим очередной знак, мы как бы «выбираем один из N равновозможных вариантов». Количество информации в таком выборе считается по формуле Хартли:

i = log₂ N — информационный вес одного символа алфавита мощностью N.

Обратная связь между ними так же важна: если известен вес символа, то размер алфавита равен N = 2ⁱ. Эти две формулы — две стороны одной монеты.

Мощность алфавита NВес символа i = log₂ NПояснение
21 битдвоичный алфавит: 0 и 1
42 бита2² = 4
83 бита2³ = 8
164 бита2⁴ = 16
325 битпримерно русские буквы без ё
2568 бит = 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 символов. Найдём объём.

  1. Вес символа: i = log₂ 32 = 5 бит (потому что 2⁵ = 32).
  2. Объём текста: V = 140 · 5 = 700 бит.
  3. Переведём в байты: 700 ÷ 8 = 87,5 байта.

Теперь обратная задача. Сообщение заняло V = 1,5 Кбайта, в нём K = 1536 символов. Какой мощности алфавит использовался?

  1. Переведём объём в биты: 1,5 Кбайт = 1,5 · 1024 · 8 = 12288 бит.
  2. Вес одного символа: i = V ÷ K = 12288 ÷ 1536 = 8 бит.
  3. Мощность алфавита: 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Где встречается
ASCII8 бит = 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 Кбайт.
Проверьте себя
1. Алфавит состоит из 64 символов. Чему равен информационный вес одного символа?
A5 бит
B6 бит
C7 бит
D8 бит
2. В алфавите мощностью 16 символов записан текст из 200 знаков. Каков его объём в битах?
A200 бит
B400 бит
C800 бит
D1600 бит
3. Почему при N = 256 объём текста в байтах совпадает с числом символов?
AПотому что log₂ 256 = 8 бит = 1 байт, и каждый символ весит ровно 1 байт
BПотому что 256 байт = 1 Кбайт
CПотому что байт всегда равен числу символов
DПотому что в ASCII пробелы не считаются
4. Сообщение заняло 12288 бит и содержит 1536 символов. Какова мощность алфавита?
A32
B64
C128
D256
5. Слово из 7 символов сохранили в кодировке Unicode (2 байта на символ). Сколько байт оно займёт?
A7 байт
B14 байт
C56 байт
D112 байт
6. Что входит в число символов K при подсчёте объёма текста алфавитным подходом?
AТолько буквы
BТолько уникальные символы алфавита
CВсе символы подряд, включая пробелы и повторы
DТолько согласные и гласные буквы
Поддержать проект