| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // package Частотник -- ищет минимально частотную архивную пару
- package frequencer
- import (
- "log"
- mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
- "gitp78su.ipnodns.ru/svi/packer/lev0/alias"
- "gitp78su.ipnodns.ru/svi/packer/lev0/types"
- "gitp78su.ipnodns.ru/svi/packer/lev1/archive_combo"
- "gitp78su.ipnodns.ru/svi/packer/lev1/archive_stat_combo"
- "gitp78su.ipnodns.ru/svi/packer/lev1/dict_keys"
- "gitp78su.ipnodns.ru/svi/packer/lev2/belt"
- )
- // Частотник -- ищет максимально частотную архивную пару
- type Частотник struct {
- лента *belt.Лента // Лента бинарных данных
- словКлючи *dict_keys.СловКлючи // Словарь задействованных ключей
- ap *archive_combo.ArchiveCombo // Частотная архивная пара
- archStatVal *archive_stat_combo.ArchiveStatCombo // Статистика частот архивных значений
- ключ alias.ArchKey // Текущий ключ для перебора
- }
- // НовЧастотник -- возвращает новый искатель максимальной архивной пары
- func НовЧастотник() *Частотник {
- сам := &Частотник{
- словКлючи: dict_keys.СловКлючиПолуч(),
- лента: belt.ЛентаПолуч(),
- ap: archive_combo.NewArchiveCombo(0, 0),
- }
- _ = types.ИЧастотник(сам)
- return сам
- }
- // Пуск -- запускает вычисление частотной архивной пары
- //
- // Считается успехом, если нашёл 5 замен архивных пар
- func (sf *Частотник) Пуск() {
- sf.ключНайти()
- binData := sf.лента.Вых()
- sf.archStatVal = archive_stat_combo.NewArchiveStatVal(binData)
- sf.ap = sf.archStatVal.Max()
- еслиНайдено := sf.ap != nil
- mKh.Hassert(еслиНайдено, "Частотник.Пуск(): not find keys for change, checked=%v", sf.archStatVal.Len())
- log.Printf("Частотник.Пуск(): архивПара=%v, checked=%v\n", sf.ap, sf.archStatVal)
- }
- // Ключи -- возвращает найденные ключи
- func (sf *Частотник) АрхивПара() types.ИАрхивПара {
- return sf.ap
- }
- // Вычисляет свободный ключ словаря подстановки (его нет в бинарном архивном списке)
- func (sf *Частотник) ключНайти() {
- binData := sf.лента.Вых()
- ключВозможно := sf.словКлючи.ВозможноКлюч()
- fnIsStop := func() bool {
- for _, binVal := range binData {
- if ключВозможно == alias.ArchKey(binVal) {
- ключВозможно = sf.словКлючи.ВозможноКлюч()
- return false
- }
- }
- return true
- }
- for fnIsStop() {
- }
- sf.ключ = ключВозможно
- }
|