Имя: Пароль:
1C
1С v8
Алгоритм Хаффмана для текста решение
0 JuixyJes
 
30.06.19
22:36
СЗ = Новый СписокЗначений;
    Для сч= 1 по (СтрДлина(ИсходныйТекст)) Цикл
        СЗ.Добавить(Сред(ИсходныйТекст,сч,1));    
    КонецЦикла;
    Для каждого Стр из СЗ Цикл
        
    КонецЦикла;
64 Вафель
 
01.07.19
12:45
(60) В гугл тебя не возьмут
65 Garykom
 
гуру
01.07.19
12:46
(63) Если частота символов не более 65536 в тексте то строка наверно самое быстрое.
66 Вафель
 
01.07.19
12:46
(62) а что хэш от 1 символа нельзя посчитать?
67 H A D G E H O G s
 
01.07.19
12:46
(66) Но зачем?
68 H A D G E H O G s
 
01.07.19
12:47
Хэшмап хорош для длинных ключей
69 Garykom
 
гуру
01.07.19
12:47
(64) И не стремлюсь туда особо, у меня решение для параконкурса но для ТС пойдет.
70 Вафель
 
01.07.19
12:47
(67) ну так хэш мэп - это константное время поиска, а интекс - логарифмическое
71 Вафель
 
01.07.19
12:48
для коротких вообще можно свой хэш мэп организаовать
72 Garykom
 
гуру
01.07.19
12:48
(65)+ Хотя кто мешает завести еще одну строку, когда переполнена предыдущая по символу
73 Cyberhawk
 
01.07.19
12:48
(71) "свой хэш мэп организаовать" // Ну так соответствие же вроде это оно и есть?
74 Вафель
 
01.07.19
12:48
Хэш[КодСимвола(Символа)]++
75 H A D G E H O G s
 
01.07.19
12:49
(70) У тебя таблица будет максимум из 65535 строк . Тут и логарифм нормален. А для хэшмапа еще и хэш строить.
76 Вафель
 
01.07.19
12:49
(73) чтобы исключить операцию вычисления хэша
77 H A D G E H O G s
 
01.07.19
12:50
(76) ты хотел сказать - "переложить ее на платформу"
78 H A D G E H O G s
 
01.07.19
12:51
Алгоритмы Хаффмана они собрались строить, ага
79 Вафель
 
01.07.19
12:51
(74) Хэш - это массив
80 Garykom
 
гуру
01.07.19
12:51
(75) +1. Символ(0) не забыл?
81 Garykom
 
гуру
01.07.19
12:52
(77) (78) Обрати внимание что у тебя начинается "старческое брюзжание" ))
82 H A D G E H O G s
 
01.07.19
12:53
(81) Давно пора
83 Cyberhawk
 
01.07.19
12:55
(76) А получение элемента массива по индексу разве не тот же хэш?
84 H A D G E H O G s
 
01.07.19
13:12
(79) в 1С 8 нет классических массивов как в 7.7 и обычных яп
85 Garykom
 
гуру
01.07.19
13:16
(84) Эээ я думал там массив указателей по сути.
86 АгентБезопасной Нацио
 
01.07.19
13:34
(43) именно связный, не массив указателей?
87 H A D G E H O G s
 
01.07.19
13:36
(86) Судя по тому, что Удалить() в любом месте 1 млн массива массива отрабатывается с одинаковой скоростью - то - связный
88 Garykom
 
гуру
01.07.19
13:47
(87) Уверено что удаляет а не помечает элемент как удаленный?
Или что при каждом удаление не происходит копирование массива в новый со всеми ссылками?
89 АгентБезопасной Нацио
 
01.07.19
13:52
(87) в клюшках вроде был массив указателей. Или массив Char23...
90 H A D G E H O G s
 
01.07.19
13:52
(88) Слово предоставляется молчаливому бобу.
91 АгентБезопасной Нацио
 
01.07.19
13:53
(88) ну уж до додуматься такого, как "копирование  в новый" - это надо под грибами думать...
92 H A D G E H O G s
 
01.07.19
13:55
Гарри, а ты представляешь, как работает классический массив, как он лежит в памяти, как к нему прикрутить пометку на удаление и, самое главное, как потом сделать обращение по индексу?
93 H A D G E H O G s
 
01.07.19
13:56
Есть же понимание, что для удаление через копирование понадобиться 2x памяти в короткий момент?
94 Garykom
 
гуру
01.07.19
14:03
(92) А я что написал в (88) ?
Представляю и причем кучей разных способов с разными плюсами и минусами их.
95 Garykom
 
гуру
01.07.19
14:04
(93) А думаем почему 1С память жрет как не в себя?
96 H A D G E H O G s
 
01.07.19
14:09
(94) Массив в классическом ЯП - это кусок памяти с ячейками одинакового размера. Зная размер и номер ячейки - можно максимально быстро обратится к элементу массива. Вводя пометку на удаление, мы уже лишаемся этого.
97 Garykom
 
гуру
01.07.19
14:10
(96) Кто мешает скопировать часть массива (кусок памяти) до удаляемого и часть после удаляемого элемента в новый кусок памяти - массив
98 Garykom
 
гуру
01.07.19
14:11
(97)+ В Golang это слайсы по сути
99 АгентБезопасной Нацио
 
01.07.19
14:12
(97)  с помощью двух спиц и катушек из под ниток из булки хлеба...©
100 Garykom
 
гуру
01.07.19
14:13
(99) Получается язык Go за программинг на котором платят уже хорошие деньги
101 H A D G E H O G s
 
01.07.19
14:15
(97) 2-х кратный рост потребления памяти массивом.
102 МихаилМ
 
01.07.19
14:18
такой алгоритм работает в 20 раз быстрее
чем (22)

на анализе текста первого тома "война и мир"


ТекДлинаФайла = СтрДлина(ТекстСтрока);
Пока ТекДлинаФайла > 10 Цикл
    ТекСимвол = Лев(ТекстСтрока,1);
    
    ТекстСтрока = СтрЗаменить(ТекстСтрока,ТекСимвол,"");
    КонДлинаФайла = СтрДлина(ТекстСтрока);
    КолвоСимволов =  КонДлинаФайла-ТекДлинаФайла;
    //Сообщить("/"+ТекСимвол+"/   "+КолвоСимволов);
    ТекДлинаФайла = КонДлинаФайла;
    
КонецЦикла;
103 АгентБезопасной Нацио
 
01.07.19
14:20
(101) ну в общем, битва "массив супротив ИТЗ" есть битва неиндексированного  массива против индексированного.
но причин "сдохнуть" варианту с массивом я не вижу. тормоза вижу, а вот смерти нет... в неиндексированном врем линейное, в индексированном  логарифмическоен
104 АгентБезопасной Нацио
 
01.07.19
14:22
(102) кстати. время сильно будет зависеть от расположения символов в файле.
105 Garykom
 
гуру
01.07.19
14:24
(102) Извращенец не хуже чем у меня в (51) с СтрЧислоВхождений
106 Garykom
 
гуру
01.07.19
14:25
Так кому не влом, может соберем перечисленные извраты и проверим кто тормознее? Кому медаль самого паралгоритма?
107 Garykom
 
гуру
01.07.19
14:33
(102) Интересно можно как то еще сортировку засунуть результата?
В смысле сразу сортировка вставками.
108 Garykom
 
гуру
01.07.19
14:36
Но да понимать что можно один раз пройтись большой текст и получая очередной символ куда то его складывать суммируя.

А можно перебирать символы или из всего алфавита и считать сколько конкретного символа в тексте.

А можно соединить как (102) и перебирать символы из большого текста и сразу считать с удалением этого символа из него, автоматом большой текст для перебора сокращается.

Итого три сильно разные варианта алгоритма.
109 Garykom
 
гуру
01.07.19
14:39
Написать что ли ТС, интересно как отреагирует на (102), мозги свернутся в трубочку или нет.
110 H A D G E H O G s
 
01.07.19
14:53
(106) Метод Михаила дает раз в 20 быстрее моего, признаю. За счет быстрой свертки исходного текста.
111 Garykom
 
гуру
01.07.19
14:55
(110) И он работает по сути на копировании кусков памяти.
Как иначе можно быстро заменять в строках символы?
112 Garykom
 
гуру
01.07.19
14:57
(111)+ Это я к чему, он работает в 20 быстрее а жрет двойной объем памяти на "Войну и Мир" в начале, затем требуемый объем падает по мере обработки.
113 H A D G E H O G s
 
01.07.19
14:58
(111) Да, скорее всего так. Там около 1 мб данных.
114 Arbuz
 
01.07.19
15:15
а если ещё использовать для ТекСимвол не исходную строку а заранее заданную строку частотности букв русского языка, то будет ещё быстрее, для "Война и Мiр" конечно ;)
115 Garykom
 
гуру
01.07.19
15:17
(114) Думаю новые архиваторы так примерно и устроены, жрут кучу памяти для ускорения старых алгоритмов сжатия данных.
116 Garykom
 
гуру
01.07.19
15:18
(115)+ И места в самом архиваторе.
Т.е. частоты заранее предпрошиты, только по началу текста понять что перед нами, какой язык русский или нет и на основе этого брать заранее заданную последовальность символов.
117 Arbuz
 
01.07.19
15:28
(116) даже не столько какой язык, а какой тип данных - текст ascii, юникод, графика, звук, и т.д. на основании этого выбирается цепочка алгоритмов. это если упрощённо. потому как на основании частотности даже не символов, а последовательностей этих символов и их распределения по исходным данным (блокам) - нужно выбирать разные алгоритмы для каждого блока.
118 Arbuz
 
01.07.19
15:30
*последовательностей -> частотности последовательностей*
119 АгентБезопасной Нацио
 
01.07.19
15:55
(117) ну я то же хотел сказать.но потом посмотрел на тему, и увидел, что только тексь
120 Вафель
 
01.07.19
16:02
получается что основная броблема в том что нельзя побыстрому получить символ по индексу
121 Arbuz
 
01.07.19
16:14
основная проблема в том, что рисовать Хаффмана на 1С - это редкостный идиотизм. Дальше только 3д графику обсчитывать на ТЗ и регистрах.
122 АгентБезопасной Нацио
 
01.07.19
16:22
(121) кстати, прикольная идея - трассировку на регистрах
123 Arbuz
 
01.07.19
16:31
(122) да, да и тема на мисте "алгоритм масштабирования сплайна кубических безье на регистре сведений, помогите новичку"
124 Garykom
 
гуру
01.07.19
16:50
(123) Сколько новичок платит?
125 Arbuz
 
01.07.19
16:53
а за сколько готов взяться? :D
126 МихаилМ
 
01.07.19
17:51
(121)  (123) в 8.14  добавили решение СЛАУ . обе задачи можно свести к ним.
127 Garykom
 
гуру
01.07.19
17:55
(126) OpenCL поддержку хочу в 1С.
128 МихаилМ
 
01.07.19
18:03
129 Garykom
 
гуру
01.07.19
18:09
(128) Так не OpenGL а OpenCL это слегка иное.
130 NorthWind
 
01.07.19
20:00
(121) ну это же лаба, скорее всего, или курсовик. Я думаю, там даже не стоит задача реально сообщение в битах в файл записывать! Достаточно будет вывести на экран исходное сообщение и закодированное в виде строки из нулей и единиц.
131 NorthWind
 
01.07.19
20:02
так что вся эта мастурбация, которую тут устроили с производительностью, никакого сакрального смысла не имеет. Тем более что построение дерева и его обход с целью получения кодов реально более муторная штука.
132 rphosts
 
02.07.19
01:41
(35) (36) символов не много, но что-бы транслировать в более компактную запись (заархивировать) - требуется находить комбинации из нескольких символов и их частоту. В (26) кмк ищется частота вхождения фрагментов из 2 символов.
133 rphosts
 
02.07.19
01:41
*из 2 символов длиной
134 АгентБезопасной Нацио
 
02.07.19
08:15
(123) лучше классическая задача распознавания автомобильных номеров...
135 Провинциальный 1сник
 
02.07.19
08:57
(126) Ждем когда решение системы дифур методом Рунге-Кутта в платформу внедрят) А то мало ли. Выйдет "1С:Управление ядерным реактором", а быстродействия не хватит.
136 Garykom
 
гуру
02.07.19
15:00
(132) Комбинации из нескольких символов это сжатие по словарю, Хафман же вероятностное сжатие.

Более часто встречающиеся одиночные символы кодируются меньшим числом бит, чем реже встречающиеся.
Т.е. частые символы <8 (или 16) бит на символ, а редко >8 (или 16) бит на символ.
В результате сжатие.
137 JuixyJes
 
03.07.19
00:44
Ох етижкин пасатижкин
138 JuixyJes
 
03.07.19
00:44
Сколько вы тут понаписали, глазки расплываются..
139 palsergeich
 
03.07.19
00:45
(135) Ты зря сммешься, тут на форуме есть госпожа, у которой префиксы объектов начинаются с аэс
140 JuixyJes
 
03.07.19
00:48
Допустим, количество вхождений в текст каждого символа найдено, далее их же нужно кодом одарить для каждого, а это, как я понимаю должно быть что-то типа матрицы, не затолкаю же я в 1с дерево:D
141 JuixyJes
 
03.07.19
00:51
Чем чаще символ - тем меньше тот самый пресловутый код, это я тоже поняла, на хабре статеек начиталась. Но в плане реализации... Кашица, нужно поспать пойти, но завтра требуют от меня хоть какого то результата, потому сидим-с, думаем-с
142 JuixyJes
 
03.07.19
00:56
Понимаю, уже всем надоела. Да и по хорошему даже за такую задачку нужно платить
Но все же надеюсь на вашу помощь. В чужом коде разбираюсь хорошо, ведь за 11 лет в школе и 3 курса института научилась "списывать так чтоб не похоже было".
143 palsergeich
 
03.07.19
00:56
(141) Это где такие требования?
144 JuixyJes
 
03.07.19
00:57
(143) На обучении) Секретики - секретики.
145 palsergeich
 
03.07.19
00:58
(144) Пф. У меня своих секретиков достаточно, что бы в чужие лезть)
146 JuixyJes
 
03.07.19
00:58
(143) На работе работаю, вот, позвали работать с обучением бесплатным, а обучением оказалось самостоятельное решение задачек, просто задачки дают, а там как хочешь так и делай)
147 palsergeich
 
03.07.19
00:59
(146) ИМХО, послушай старого дядьку - не те задачи ты решаешь. В ближайшие 3 года тебе эта чистая алгоритмика понадобится может раза 2.
148 palsergeich
 
03.07.19
01:00
Нужно в проводочки и формочки - это среднесрочный фронт работ
149 JuixyJes
 
03.07.19
01:02
(145) Верю) Не подскажите? Как эту чучелу мяучелу научить мяукать? Как я понимаю мне нужно на основании вот этих символов и их частот  создать таблицу Хаффмана? На том же самом хабре написано что кодировать лучше через табличку, которая будет либо связным список либо массивом
151 JuixyJes
 
03.07.19
01:17
(148) Этим и так занимаюсь изо дня в день)
152 JuixyJes
 
03.07.19
01:18
(148) Что-то с форумом было? А то страница не грузилась
153 palsergeich
 
03.07.19
01:18
(149) Я если честно перевтыкал ERP за вечер и немного не в кондиции уже(
В час бекап снимается, около 20 минут оффлайна
154 JuixyJes
 
03.07.19
01:22
(153) Понятно) А вообще, задачка вроде бы не очень сложная, насколько я понимаю, так? Ведь осталось присвоить каждому символу свой код, а потом составить из этих кодов исходный текст в виде 0 и 1.
155 palsergeich
 
03.07.19
01:29
https://www.youtube.com/watch?v=9b2mCgSCjhw
Вот такую шню надо сделать)
156 craxx
 
03.07.19
04:51
(147) Норм задачки она решает. Мозги должны работать и искать пути решения. А не шпарить по шаблону
157 Провинциальный 1сник
 
03.07.19
08:04
(141) Задачка интересная и не так чтобы особо сложная. Уровень курсовика 2 курса программистской направленности. Но явно не уровня лабораторной работы, соответственно за пару вечеров это не сделать. И более помочь, чем гугл, форум вряд ли сумеет вам.
158 АгентБезопасной Нацио
 
03.07.19
08:14
+(156)  И чем больше путей решения будет рассмотрено, тем легче будет решать будущие нешаблонные проблемки.
(157) так а что там выше трех лаботаторок? тем более, первый этап - построение частотности - уже фактически дали. вторая лаба - сопоставить символ/частоту/код. ну и третья лаба - читать поток, перекодировать, писать в другой... Из стандартного студенчского тайминга: "лаба за вечер, курсовик за ночь". и с учетом  известной первой части - осталось работы на два вечера.
159 Провинциальный 1сник
 
03.07.19
08:20
(158) Ну я имею в виду не демонстрацию алгоритма, а более-менее отлаженный продукт, пусть и не оптимизированный. А если в оптимизацию влезть, то там можно вообще бесконечно дорабатывать.
160 АгентБезопасной Нацио
 
03.07.19
09:06
(159) ну так "хаффман на 1с" - не для продакшена пишется.
161 JuixyJes
 
05.07.19
23:16
Вечер добрый, форумчане! Допенькала я как мне приблизиться к решению задачки, и кодируется пусть не оптимально, но кодируется, пока что собственноручно вбивается код. Не подскажите, как в обратную сторону строку с тем же алфавитом раскодировать?
162 JuixyJes
 
05.07.19
23:17
Могу обработку скинуть, она на обычных формах сделана
163 АгентБезопасной Нацио
 
06.07.19
07:18
(162) декодеру код (а не алфавит) должен быть известен перед раскодированием.
К там уже просто - побитно читаешь вход и спускаешься по дереву до листа.