Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 131
#16: 2020-02-29 16:08:12 ЛС | профиль | цитата
просто по клавишам.

Я похожую задачу решал для такого проекта: https://gamedev.ru/projects/forum/?id=247564
Делаю сюжет для игры и за одно пишу повесть по этому-же сюжету.
Весь текст и диалоги для озвучки генерируются нейронной сетью. ИИ юнитов сделан на той-же сетке, только с другим обучением.
Для обучения нейронной сети делал Марковские цепи по всей библиотеке http://o53xo.obzg66dz.mzwgsytvon2gcltjom.cmle.ru/g/sf_space
Т.е. искались цепочки зависимых слов с наибольшей выразительностью и наибольшей частотностью употребления для конкретных случаев и обстановки. ...
Примеры:
https://yadi.sk/d/NV7i3B5WKRLksg
https://yadi.sk/d/e1zMHdlVE61fcA
https://yadi.sk/d/508SKLvVA-yGdg

Отрывок письма:
Hu
Ответить
Вообщем дал на оценку, получил крайне положительный отзыв : *Выглядит так, буд-то писал настоящий писатель, если не обращать внимание на некоторые недочеты* это про поход покурить человек не понял и определенные повторения одинакового слова(совпадения).
Сам я тоже почитал, текст выглядит довольно хорошо, если там редактура и нужна, то не так, что-бы резать всё, а просто сводить концы самую малость. Переходы в сцене достаточно гладкие.
Можно узнать каких усилий это стоило, заставить нейросеть такое выплёвывать, или это ручная правка?
П.С. Мне понравилось, можно переходить к следующей сцене? Завтра, если интересно, так-же покажу конечный вариант после редактуры.

Думаю, будет время, то можно сделать порт сети в HiAsm. (в проекте всё делаю на C++)
Тогда такие цепочки, как у тебя в задаче, можно искать на раз!
Только вот потрачу время, а это никому не нужно будет...
https://gamedev.ru/projects/forum/?id=249247&m=5104768#m10
https://gamedev.ru/projects/forum/?id=249247&page=2&m=5105040#m27

Редактировалось 6 раз(а), последний 2020-02-29 16:35:21
карма: 6

0
Ответов: 4621
Рейтинг: 746
#17: 2020-03-02 14:32:24 ЛС | профиль | цитата
nesco писал(а):
Бери выше -- это около 1 петабайта
Да не, 1 терабайт (1023.99 Гб).
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#18: 2020-03-02 16:41:04 ЛС | профиль | цитата
Netspirit писал(а):
Да не, 1 терабайт (1023.99 Гб).

Да, действительно:

1099508482048 / 1024 = 1073738752 Кб
1073738752 / 1024 = 1048573 Мб
1048573 / 1024 = 1024 Гб
1024 / 1024 = 1 Тб

Редактировалось 3 раз(а), последний 2020-03-02 17:58:10
карма: 22

0
Ответов: 8887
Рейтинг: 823
#19: 2020-03-02 16:58:37 ЛС | профиль | цитата
Для известных включений, можно воспользоваться разложением Фурье и искать совпадения на шкале частот - будет ответ "есть или нет". Если есть, то уже искать место совпадения. (Так ищутся и извлекается из-под шума события гравитационных волн по более чем двум сотням тысяч заранее подсчитанных шаблонам).
Для не известных совпадающих включений через Фурье тоже можно сравнивать, но вероятность "угадывания" поменьше.
А вот "в лоб" перебирать без супер-компьютера никакого терпения не хватит, у меня вот не хватило на сравнение двух файлов 1 и 0.5 Мб, пришлось останавливать а вот 10 и 5 кб сравнил за 0.39 сек
ПоискСовпадений_10кбх5кб.jpg
ПоискСовпадений_1мбх0,5мб.jpg
карма: 19

0
Ответов: 4621
Рейтинг: 746
#20: 2020-03-02 17:33:33 ЛС | профиль | цитата
nesco, у тебя результат второго деления неверный.
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#21: 2020-03-02 18:00:25 ЛС | профиль | цитата
Netspirit писал(а):
у тебя результат второго деления неверный.

Действительно, че-то я ошибся в знаках (да и скопировал дважды одно число), хотя вроде несколько раз пересчитывал (тут смайлик "почесал репу"). Короче, на пенсию пора

Редактировалось 1 раз(а), последний 2020-03-02 18:05:40
карма: 22

0
Ответов: 4621
Рейтинг: 746
#22: 2020-03-02 18:11:31 ЛС | профиль | цитата
Так и я изначально на предыдщей странице когда считал - количеством делений ошибся. Даже после того как несколько раз пересчитывал - не мог решить в каких же единицах у меня результат получился. Не угадал.
карма: 26

0
Ответов: 9906
Рейтинг: 351
#23: 2020-03-03 12:36:30 ЛС | профиль | цитата
nesco писал(а):
хотя вроде несколько раз пересчитывал

Проще надо быть...
Мегабайт - 6 порядков (они же - нолики),
Гигабайт - 9 порядков,
Терабайт - 12 порядков,
Пентабайт - 15 порядков,
и т.д..
Какие нафиг деления, о чем вы говорите...

Netspirit писал(а):
То-есть, когда есть 2 файла по 1 МБ (1048576 байт), то читая 4 байта из 1-го файла и сдвигая на 1 байт, 2-й файл нужно прочитать 1048576 раз. Это объем данных ((1048576 - 3) * 1048576) = 1099508482048 байт, или 1 Терабайт

Теоретически (пока), от терабайтов можно уйти, и не делая слишком умное лицо...
Простеньким хешированием.
Ну скажем, пусть 2-х байтным хешом будут тупо первые два байта последовательности, как целое число.
Ведь ТС как бы заикался и о 2-х байтных совпадениях.

Ну и все. Просматриваем на совпадения теперь уже не весь словарь, а только с тех мест (взятых из хеш-таблицы), которые начинаются именно с нужных 2-х байт.
Тоже не самая быстрая история... Но 4.8 ( = lg(2^16) ) порядка отыграть можно (особенно, если словарь без повторов).
А пара десятков "МегаОпов" - это уже не "ТераОп"

Пока не делал. Вроде бы целочисленных массивов достаточно... Но то, чего у нас есть в элементной базе - слишком уж долбанутое, в плане эффективности.

Редактировалось 12 раз(а), последний 2020-03-03 14:58:51
карма: 9

0
Ответов: 4621
Рейтинг: 746
#24: 2020-03-03 12:55:23 ЛС | профиль | цитата
Galkov писал(а):
Терабайт - 12 порядков
Ну, так это ещё циферки посчитать надо...
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#25: 2020-03-03 14:51:48 ЛС | профиль | цитата
Netspirit писал(а):
Ну, так это ещё циферки посчитать надо...

Во-во -- считаешь одно, а в голове совсем другое.
карма: 22

0
Ответов: 188
Рейтинг: 2
#26: 2020-03-07 22:12:14 ЛС | профиль | цитата
Galkov писал(а):
Ведь ТС как бы заикался и о 2-х байтных совпадениях.

кстати по 2 байта поиск осуществляется намного дольше чем чем на пример по 4 байта

--- Добавлено в 2020-03-07 23:09:10

кстати я тут подумал а что если один файл грузить в базу данных, а из другого брать значения для поиска, база данных возможно быстрее будет обрабатывать запросы или я ошибаюсь?

Редактировалось 1 раз(а), последний 2020-03-07 23:09:10
карма: 0

0
Ответов: 9906
Рейтинг: 351
#27: 2020-03-14 14:42:49 ЛС | профиль | цитата
Вот гляжу я на этот топик, и меня начали терзать смутные сомнения.....
Что то, о чем я говорил - никто не понял
Судя по энтузиазму воплощения в схему, высказанной мной идеи.

Тоды: это делается примерно так:
Тест индексирования словаря

Add(MainForm,2953706,336,77)
{
Width=483
Height=114
Caption="Тест индексирования словаря"
}
Add(Button,2823604,28,56)
{
Left=14
Top=14
Caption="Словарь"
link(onClick,10410305:doExecute,[])
}
Add(ODialog,10410305,77,56)
{
link(onExecute,550519:doOpen,[])
}
Add(FileStream,550519,133,56)
{
link(onLoad,7747773:doEvent1,[])
}
Add(GetDataEx,1108458,406,224)
{
link(Data,9769920:Pos,[])
}
Add(Hub,7747773,182,56)
{
OutCount=5
link(onEvent1,1784996:doWork1,[(319,62)])
link(onEvent2,13093263:doStart,[])
link(onEvent3,13093263:doStop,[])
link(onEvent4,3503074:doEnabled,[(214,83)(214,111)(32,111)(32,188)])
link(onEvent5,550519:doClose,[(207,90)(207,104)(123,104)(123,69)])
}
Add(DoData,9494196,665,252)
{
link(onEventData,3564018:doPut,[])
link(Data,13647147:ResultString,[])
}
Add(Hub,9491899,147,182)
{
OutCount=5
link(onEvent1,9718670:doTimer,[(179,188)(179,293)])
link(onEvent2,7806628:doOpen,[])
link(onEvent3,7806628:doClose,[])
link(onEvent4,9718670:doStop,[(172,209)(172,300)])
link(onEvent5,12726438:doWork1,[(235,216)])
}
Add(TimeCounter,13093263,224,63)
{
link(onStart,9769920:doLoad,[(375,69)(375,188)])
link(onStop,198127:doStrCatDlm,[])
}
Add(For,3827780,315,189)
{
End=65535
link(onEvent,9769920:doHash,[])
}
Add(Math,16212320,357,287)
{
OpType=3
Op2=655.35
ResultType=0
link(onResult,14219118:doData,[])
link(Op1,16365021:Var2,[])
}
Add(InlineCode,13647147,665,189)
{
@Hint=#18:String Accumulator|41:для минимизации копирований и реаллокаций|
WorkPoints=#6:doLoad|8:doAppend|
VarPoints=#12:ResultString|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|28: ByteArr:array of byte;|18: Pos:integer;|10: public|47: procedure doLoad(var dt:TData; idx:word);|49: procedure doAppend(var dt:TData; idx:word);|53: procedure ResultString(var dt:TData; idx:word);|6: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doLoad;|24:var S:string; L:integer;|5:begin|20: S := ToString(dt);|17: L := length(S);|32: SetLength(ByteArr, L*3 div 2);|28: Move(S[1], ByteArr[0], L);|11: Pos := L;|4:end;|0:|31:procedure THiAsmClass.doAppend;|24:var S:string; L:integer;|5:begin|20: S := ToString(dt);|17: L := length(S);|33: if Pos+L > length(ByteArr) then|40: SetLength(ByteArr, (L+Pos)*3 div 2);|30: Move(S[1], ByteArr[Pos], L);|14: inc(Pos, L);|4:end;|0:|35:procedure THiAsmClass.ResultString;|13:var S:string;|5:begin|20: SetLength(S, Pos);|30: Move(ByteArr[0], S[1], Pos);|18: dtString(dt, S);|4:end;|0:|4:end.|
AddHint(-79,-56,172,39,@Hint)
}
Add(StrCat,5830591,616,196)
{
Str1=","
link(onStrCat,13647147:doAppend,[])
}
Add(HubEx,12726438,231,287)
{
link(onEvent,13110199:doEvent1,[])
}
Add(ProgressBar,4002621,476,287)
{
Top=55
Width=467
Align=4
ProgressColor=-16777203
}
Add(Timer,9718670,189,287)
{
Interval=100
Enable=1
link(onTimer,12726438:doWork2,[])
}
Add(FileStream,7806628,259,189)
{
Mode=1
link(onLoad,3827780:doFor,[])
}
Add(StrCatDelim,16729616,399,343)
{
Delimiter=": "
link(onStrCatDlm,15437502:doText,[])
link(Str1,16365021:Var3,[(405,271)])
link(Str2,1108458:Var2,[])
}
Add(SDialog,2876694,91,182)
{
FileName="VocHash.txt"
link(onExecute,9491899:doEvent1,[])
}
Add(Convertor,1471636,518,189)
{
Mode=6
Digits=4
link(onResult,13731433:doStrCatDlm,[])
link(Data,11792470:Var1,[(524,173)(363,173)])
}
Add(Hub,13110199,287,287)
{
link(onEvent1,16212320:doOperation,[])
link(onEvent2,16729616:doStrCatDlm,[(312,300)(312,349)])
}
Add(Label,15437502,476,343)
{
Left=217
Top=14
Width=32
Height=22
Font=[MS Sans Serif,10,0,0,1]
Caption="0000"
}
Add(Button,3503074,42,182)
{
Left=91
Top=14
Width=69
Enabled=1
Caption="в ТЕКСТ"
Point(doEnabled)
link(onClick,2876694:doExecute,[])
}
Add(ChangeMon,14219118,427,287)
{
link(onData,4002621:doPosition,[])
}
Add(StrCatDelim,13731433,567,189)
{
Delimiter=": "
link(onStrCatDlm,13647147:doLoad,[])
link(Str2,1108458:Var3,[(580,180)(559,180)(559,229)])
}
Add(DataToFileEx,3564018,714,245)
{
Type=4
DataSize=2
Point(doPosition)
link(Stream,7806628:Stream,[(720,236)(265,236)])
}
Add(GetDataEx,11792470,357,224)
{
Angle=3
link(Data,3827780:Position,[(321,229)])
}
Add(GetDataEx,16365021,357,266)
{
link(Data,11792470:Var2,[])
}
Add(MultiElementEx,9769920,399,182)
{
@Hint=#74:Словарь, индексированный по первым двум байтам последовательности символов|
Name="Hash"
link(onFirstPos,8703109:doEvent1,[])
link(onNextPos,9275719:doEvent1,[])
link(onEndList,9494196:doData,[(438,202)(438,258)])
AddHint(-5,-114,174,39,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,10199030,21,21)
{
WorkCount=#34:doLoad=Загрузка+Индексация словаря|102:doHash=Поиск позиций в словаре, соответствующих ключу (два первых байта последовательности, как целое)|32:doStop=Преждевременная остановка|
EventCount=#64:onFirstPos=Вход в список позиций для ключа, заданного по doHash |60:onNextPos=Последующие позиции для ключа, заданного по doHash|78:onEndList=Сообщение об окончании списка позиций для ключа, заданного по doHash|
VarCount=#134:VocStream=Загруженный по doLoad словарь, предустановленный (для удобства дальнейших сравнений) сразу после найденных по doHash позиций|88:Pos=Позиция в словаре при активизации выходов onFirstPos и onNextPos (в ответ на doHash)|
Width=426
Height=382
VOffset=287
HOffset=224
link(doLoad,2204106:doCopy,[(32,314)(32,118)])
link(doHash,3991985:doRead,[(39,321)(39,307)])
link(doStop,4635615:doWork2,[(60,328)(60,363)])
link(VocStream,13641125:Var3,[(251,187)])
link(Pos,2630774:Var1,[(258,306)])
}
Add(ArrayRW,3123448,294,203)
{
link(onRead,314531:doWrite,[])
link(Array,1903610:Var2,[])
link(Value,14531255:Var2,[])
}
Add(MemoryStream,2204106,49,112)
{
link(onCopy,15738292:doOperation,[])
}
Add(For,13673247,105,217)
{
Step=-1
InData=0
link(onEvent,4247253:doEvent1,[])
}
Add(Hub,4247253,154,217)
{
link(onEvent1,12366427:doWork2,[])
link(onEvent2,8348129:doGet,[(179,230)(179,209)])
}
Add(DataToFileEx,8348129,196,203)
{
DataSize=2
Point(doPosition)
link(onGet,12097523:doEvent1,[])
link(Stream,13641125:Var2,[])
}
Add(InlineCode,9964384,294,56)
{
@Hint=#13:Integer Array|19:- Entry to HashList|
WorkPoints=#9:doSetSize|8:doMemSet|
VarPoints=#12:IntegerArray|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|27: IntArr:array of integer;|15: Arr:TXArray;|52: procedure _Set(var Item:TData; var Val:TData);|36: procedure _Add(var Val:TData);|60: function _Get(Var Item:TData; var Val:TData):boolean;|31: function _Count:integer;|10: public|22: constructor Create;|47: procedure doSetSize(var dt:TData; idx:word);|46: procedure doMemSet(var dt:TData; idx:word);|53: procedure IntegerArray(var dt:TData; idx:word);|6: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|21: Arr._Set := _Set;|21: Arr._Add := _Add;|21: Arr._Get := _Get;|22: Arr._Count := _Count|4:end;|0:|27:procedure THiAsmClass._Set;|16:var ind:integer;|5:begin|27: ind := ToIntIndex(Item);|46: if (ind >= 0)and(ind < length(IntArr)) then|36: IntArr[ind] := ToInteger(Val);|4:end;|0:|27:procedure THiAsmClass._Add;|5:begin|39: SetLength(IntArr, length(IntArr)+1);|42: IntArr[high(IntArr)] := ToInteger(Val);|4:end;|0:|26:function THiAsmClass._Get;|16:var ind:integer;|5:begin|27: ind := ToIntIndex(Item);|49: Result := (ind >= 0)and(ind < length(IntArr));|46: if Result then dtInteger(Val, IntArr[ind]);|4:end;|0:|28:function THiAsmClass._Count;|5:begin|28: Result := length(IntArr);|4:end;|0:|32:procedure THiAsmClass.doSetSize;|5:begin|35: SetLength(IntArr, ToInteger(dt));|4:end;|0:|31:procedure THiAsmClass.doMemSet;|16:var i,m:integer;|5:begin|21: m := ToInteger(dt);|31: for i := 0 to high(IntArr) do|19: IntArr[i] := m;|4:end;|0:|35:procedure THiAsmClass.IntegerArray;|5:begin|20: dtArray(dt, @Arr);|4:end;|0:|4:end.|
@IsLib=True
AddHint(37,-2,86,26,@Hint)
}
Add(Math,15738292,105,112)
{
OpType=1
Op2=1
ResultType=0
link(onResult,7061963:doEvent1,[])
link(Op1,2204106:Size,[(111,103)(97,103)(97,152)(62,152)])
}
Add(InlineCode,6030611,350,119)
{
@Hint=#13:Integer Array|18:- Tail of HashList|
elink(9964384)
AddHint(-18,-33,79,26,@Hint)
}
Add(ArrayRW,314531,350,196)
{
link(Array,13276856:Var2,[])
link(Index,14531255:Var3,[(363,187)])
}
Add(Hub,12097523,266,203)
{
link(onEvent1,3123448:doRead,[])
link(onEvent2,3123448:doWrite,[])
}
Add(GetDataEx,14531255,308,182)
{
Angle=3
link(Data,13673247:Position,[(258,187)(258,257)(111,257)])
}
Add(Timer,3315013,105,56)
{
@Hint=#10:Start INIT|
Interval=0
AutoStop=1
link(onTimer,8483149:doData,[])
AddHint(-19,-22,61,13,@Hint)
}
Add(DoData,8483149,182,56)
{
@Hint=#6:$10000|
Data=Integer(65536)
link(onEventData,9964384:doSetSize,[])
AddHint(-14,-22,51,13,@Hint)
}
Add(Hub,7061963,154,112)
{
OutCount=3
link(onEvent1,12237287:doData,[(221,118)(221,69)])
link(onEvent2,6030611:doSetSize,[])
link(onEvent3,6037519:doOperation,[(179,132)(179,202)(46,202)(46,223)])
}
Add(DoData,12237287,238,63)
{
Data=Integer(-1)
link(onEventData,9964384:doMemSet,[])
AddHint(0,-29,24,13,Data)
}
Add(GetDataEx,1903610,294,154)
{
link(Data,9964384:IntegerArray,[])
}
Add(If_else,2046476,119,301)
{
Type=4
Op2=Integer(0)
link(onTrue,14186977:doEvent1,[])
}
Add(Repeat,1024522,210,322)
{
link(onRepeat,11909561:doRead,[])
}
Add(ArrayRW,11909561,266,322)
{
link(onRead,15153304:doCompare,[])
link(Array,13276856:Var3,[(272,166)])
link(Index,2630774:Var2,[])
}
Add(GetDataEx,13276856,350,161)
{
link(Data,6030611:IntegerArray,[])
}
Add(If_else,15153304,322,322)
{
Type=4
Op2=Integer(0)
link(onTrue,3557159:doEvent1,[])
link(onFalse,4635615:doWork1,[(361,335)(361,363)])
}
Add(Memory,9048510,273,259)
{
link(onData,7181297:doOperation,[])
}
Add(Hub,3557159,371,322)
{
link(onEvent1,16340614:doWork3,[(396,328)(396,300)(256,300)])
link(onEvent2,10199030:onNextPos,[(403,335)(403,321)])
}
Add(HubEx,16340614,252,259)
{
link(onEvent,9048510:doValue,[])
}
Add(GetDataEx,2630774,273,301)
{
link(Data,9048510:Value,[])
}
Add(Math,6037519,56,217)
{
OpType=1
Op2=1
ResultType=0
link(onResult,13673247:doFor,[])
}
Add(ArrayRW,3991985,70,301)
{
link(onRead,2046476:doCompare,[])
link(Array,1903610:Var1,[(76,159)])
}
Add(Hub,14186977,168,301)
{
OutCount=4
link(onEvent1,16340614:doWork2,[(200,307)(200,265)])
link(onEvent2,10199030:onFirstPos,[])
link(onEvent3,1024522:doRepeat,[(200,321)(200,328)])
link(onEvent4,10199030:onEndList,[(193,328)(193,370)(410,370)(410,328)])
}
Add(GetDataEx,13641125,196,182)
{
Angle=3
link(Data,2204106:Stream,[(55,187)])
}
Add(Math,7181297,322,259)
{
Op2=2
ResultType=0
link(onResult,12366427:doWork3,[(361,265)(361,251)(186,251)])
}
Add(HubEx,12366427,182,217)
{
link(onEvent,8348129:doPosition,[])
}
Add(HubEx,4635615,196,357)
{
Angle=3
link(onEvent,1024522:doStop,[(200,335)])
}
END_SDK
Add(Hub,9275719,448,189)
{
link(onEvent1,6729505:doWork2,[(473,195)(473,139)])
link(onEvent2,5830591:doStrCat,[])
}
Add(Hub,8703109,483,182)
{
link(onEvent1,6729505:doWork3,[(508,188)])
link(onEvent2,1471636:doConvert,[])
}
Add(Application,6093389,518,133)
{
Wait=1
Point(onTerminate)
link(onTerminate,9129885:doWork3,[(557,139)(557,125)])
}
Add(Hub,11711312,280,154)
{
link(onEvent1,9769920:doStop,[(368,160)(368,202)])
link(onEvent2,3827780:doStop,[(305,167)(305,202)])
}
Add(Button,15189132,42,119)
{
Left=168
Top=14
Width=34
Caption="Стоп"
link(onClick,9129885:doWork2,[])
}
Add(StrCatDelim,198127,273,70)
{
Str1="Время загрузки/индексации "
Str2=" мсек"
link(onStrCatDlm,1784996:doWork2,[])
}
Add(HubEx,9129885,266,119)
{
Angle=1
link(onEvent,11711312:doEvent1,[(270,160)])
}
Add(HubEx,6729505,504,133)
{
link(onEvent,6093389:doProcessMessages,[])
}
Add(HubEx,1784996,315,70)
{
Angle=1
link(onEvent,2953706:doCaption,[(319,83)])
}
Поиск в индексированном словаре

Add(Label,1824696,798,112)
{
@Hint=#23:Чтоб никто не догадался|
Width=430
Height=43
Align=2
Caption=""
AutoSize=1
AddHint(-59,-23,143,13,@Hint)
}
Add(MainForm,14415943,336,56)
{
Width=446
Height=457
Caption="Поиск в индексированном словаре"
}
Add(Button,2823604,28,35)
{
Left=14
Top=14
Caption="Словарь"
link(onClick,10410305:doExecute,[])
}
Add(ODialog,10410305,70,35)
{
link(onExecute,550519:doOpen,[])
}
Add(FileStream,550519,119,35)
{
link(onLoad,7747773:doEvent1,[])
}
Add(Hub,7747773,168,35)
{
OutCount=5
link(onEvent1,16091653:doWork1,[(319,41)])
link(onEvent2,13093263:doStart,[])
link(onEvent3,13093263:doStop,[])
link(onEvent4,3503074:doEnabled,[(200,62)(200,90)(32,90)(32,167)])
link(onEvent5,550519:doClose,[(193,69)(193,83)(109,83)(109,48)])
}
Add(TimeCounter,13093263,224,42)
{
link(onStart,9769920:doLoad,[(445,48)(445,160)])
link(onStop,198127:doStrCatDlm,[])
}
Add(For,3827780,315,175)
{
IncludeEnd=1
link(onEvent,180655:doEvent1,[])
link(End,161234:Var1,[(328,166)(293,166)])
}
Add(Math,16212320,315,336)
{
OpType=3
link(onResult,16582522:doOperation,[])
link(Op1,15696705:Var2,[])
link(Op2,161234:Var3,[(328,222)])
}
Add(ProgressBar,4002621,511,336)
{
Top=398
Width=430
Align=4
ProgressColor=-16777203
}
Add(Timer,9718670,231,336)
{
Interval=100
Enable=1
link(onTimer,13110199:doEvent1,[])
}
Add(FileStream,7806628,133,161)
{
link(onLoad,15415920:doEvent1,[])
}
Add(StrCatDelim,16729616,462,378)
{
Delimiter=": "
link(onStrCatDlm,15437502:doText,[])
link(Str1,2816362:Var2,[])
link(Str2,9769920:Pos,[])
}
Add(Hub,13110199,280,336)
{
link(onEvent1,16212320:doOperation,[])
link(onEvent2,16729616:doStrCatDlm,[(305,349)(305,384)])
}
Add(Label,15437502,511,378)
{
Left=301
Top=14
Width=32
Height=22
Font=[MS Sans Serif,10,0,0,1]
Caption="0000"
}
Add(Button,3503074,42,161)
{
Left=91
Top=14
Width=69
Enabled=1
Caption="Поиск в..."
Point(doEnabled)
link(onClick,3944805:doExecute,[])
}
Add(ChangeMon,14219118,413,336)
{
link(onData,4002621:doPosition,[])
}
Add(MultiElementEx,9769920,462,154)
{
@Hint=#74:Словарь, индексированный по первым двум байтам последовательности символов|
Name="Hash"
link(onFirstPos,8703109:doEvent1,[])
link(onNextPos,9275719:doEvent1,[])
AddHint(-3,-114,174,39,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,10199030,21,21)
{
WorkCount=#34:doLoad=Загрузка+Индексация словаря|102:doHash=Поиск позиций в словаре, соответствующих ключу (два первых байта последовательности, как целое)|32:doStop=Преждевременная остановка|
EventCount=#64:onFirstPos=Вход в список позиций для ключа, заданного по doHash |60:onNextPos=Последующие позиции для ключа, заданного по doHash|78:onEndList=Сообщение об окончании списка позиций для ключа, заданного по doHash|
VarCount=#134:VocStream=Загруженный по doLoad словарь, предустановленный (для удобства дальнейших сравнений) сразу после найденных по doHash позиций|88:Pos=Позиция в словаре при активизации выходов onFirstPos и onNextPos (в ответ на doHash)|
Width=426
Height=382
VOffset=287
HOffset=224
link(doLoad,2204106:doCopy,[(32,314)(32,118)])
link(doHash,3991985:doRead,[(39,321)(39,307)])
link(doStop,4635615:doWork2,[(60,328)(60,363)])
link(VocStream,13641125:Var3,[(251,187)])
link(Pos,2630774:Var1,[(258,306)])
}
Add(ArrayRW,3123448,294,203)
{
link(onRead,314531:doWrite,[])
link(Array,1903610:Var2,[])
link(Value,14531255:Var2,[])
}
Add(MemoryStream,2204106,49,112)
{
link(onCopy,15738292:doOperation,[])
}
Add(For,13673247,105,217)
{
Step=-1
InData=0
link(onEvent,4247253:doEvent1,[])
}
Add(Hub,4247253,154,217)
{
link(onEvent1,12366427:doWork2,[])
link(onEvent2,8348129:doGet,[(179,230)(179,209)])
}
Add(DataToFileEx,8348129,196,203)
{
DataSize=2
Point(doPosition)
link(onGet,12097523:doEvent1,[])
link(Stream,13641125:Var2,[])
}
Add(InlineCode,9964384,294,56)
{
@Hint=#13:Integer Array|19:- Entry to HashList|
WorkPoints=#9:doSetSize|8:doMemSet|
VarPoints=#12:IntegerArray|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|27: IntArr:array of integer;|15: Arr:TXArray;|52: procedure _Set(var Item:TData; var Val:TData);|36: procedure _Add(var Val:TData);|60: function _Get(Var Item:TData; var Val:TData):boolean;|31: function _Count:integer;|10: public|22: constructor Create;|47: procedure doSetSize(var dt:TData; idx:word);|46: procedure doMemSet(var dt:TData; idx:word);|53: procedure IntegerArray(var dt:TData; idx:word);|6: end;|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|21: Arr._Set := _Set;|21: Arr._Add := _Add;|21: Arr._Get := _Get;|22: Arr._Count := _Count|4:end;|0:|27:procedure THiAsmClass._Set;|16:var ind:integer;|5:begin|27: ind := ToIntIndex(Item);|46: if (ind >= 0)and(ind < length(IntArr)) then|36: IntArr[ind] := ToInteger(Val);|4:end;|0:|27:procedure THiAsmClass._Add;|5:begin|39: SetLength(IntArr, length(IntArr)+1);|42: IntArr[high(IntArr)] := ToInteger(Val);|4:end;|0:|26:function THiAsmClass._Get;|16:var ind:integer;|5:begin|27: ind := ToIntIndex(Item);|49: Result := (ind >= 0)and(ind < length(IntArr));|46: if Result then dtInteger(Val, IntArr[ind]);|4:end;|0:|28:function THiAsmClass._Count;|5:begin|28: Result := length(IntArr);|4:end;|0:|32:procedure THiAsmClass.doSetSize;|5:begin|35: SetLength(IntArr, ToInteger(dt));|4:end;|0:|31:procedure THiAsmClass.doMemSet;|16:var i,m:integer;|5:begin|21: m := ToInteger(dt);|31: for i := 0 to high(IntArr) do|19: IntArr[i] := m;|4:end;|0:|35:procedure THiAsmClass.IntegerArray;|5:begin|20: dtArray(dt, @Arr);|4:end;|0:|4:end.|
@IsLib=True
AddHint(37,-2,86,26,@Hint)
}
Add(Math,15738292,105,112)
{
OpType=1
Op2=1
ResultType=0
link(onResult,7061963:doEvent1,[])
link(Op1,2204106:Size,[(111,103)(97,103)(97,152)(62,152)])
}
Add(InlineCode,6030611,350,119)
{
@Hint=#13:Integer Array|18:- Tail of HashList|
elink(9964384)
AddHint(-18,-33,79,26,@Hint)
}
Add(ArrayRW,314531,350,196)
{
link(Array,13276856:Var2,[])
link(Index,14531255:Var3,[(363,187)])
}
Add(Hub,12097523,266,203)
{
link(onEvent1,3123448:doRead,[])
link(onEvent2,3123448:doWrite,[])
}
Add(GetDataEx,14531255,308,182)
{
Angle=3
link(Data,13673247:Position,[(258,187)(258,257)(111,257)])
}
Add(Timer,3315013,105,56)
{
@Hint=#10:Start INIT|
Interval=0
AutoStop=1
link(onTimer,8483149:doData,[])
AddHint(-19,-22,61,13,@Hint)
}
Add(DoData,8483149,182,56)
{
@Hint=#6:$10000|
Data=Integer(65536)
link(onEventData,9964384:doSetSize,[])
AddHint(-14,-22,51,13,@Hint)
}
Add(Hub,7061963,154,112)
{
OutCount=3
link(onEvent1,12237287:doData,[(221,118)(221,69)])
link(onEvent2,6030611:doSetSize,[])
link(onEvent3,6037519:doOperation,[(179,132)(179,202)(46,202)(46,223)])
}
Add(DoData,12237287,238,63)
{
Data=Integer(-1)
link(onEventData,9964384:doMemSet,[])
AddHint(0,-29,24,13,Data)
}
Add(GetDataEx,1903610,294,154)
{
link(Data,9964384:IntegerArray,[])
}
Add(If_else,2046476,119,301)
{
Type=4
Op2=Integer(0)
link(onTrue,14186977:doEvent1,[])
}
Add(Repeat,1024522,210,322)
{
link(onRepeat,11909561:doRead,[])
}
Add(ArrayRW,11909561,266,322)
{
link(onRead,15153304:doCompare,[])
link(Array,13276856:Var3,[(272,166)])
link(Index,2630774:Var2,[])
}
Add(GetDataEx,13276856,350,161)
{
link(Data,6030611:IntegerArray,[])
}
Add(If_else,15153304,322,322)
{
Type=4
Op2=Integer(0)
link(onTrue,3557159:doEvent1,[])
link(onFalse,4635615:doWork1,[(361,335)(361,363)])
}
Add(Memory,9048510,273,259)
{
link(onData,7181297:doOperation,[])
}
Add(Hub,3557159,371,322)
{
link(onEvent1,16340614:doWork3,[(396,328)(396,300)(256,300)])
link(onEvent2,10199030:onNextPos,[(403,335)(403,321)])
}
Add(HubEx,16340614,252,259)
{
link(onEvent,9048510:doValue,[])
}
Add(GetDataEx,2630774,273,301)
{
link(Data,9048510:Value,[])
}
Add(Math,6037519,56,217)
{
OpType=1
Op2=1
ResultType=0
link(onResult,13673247:doFor,[])
}
Add(ArrayRW,3991985,70,301)
{
link(onRead,2046476:doCompare,[])
link(Array,1903610:Var1,[(76,159)])
}
Add(Hub,14186977,168,301)
{
OutCount=4
link(onEvent1,16340614:doWork2,[(200,307)(200,265)])
link(onEvent2,10199030:onFirstPos,[])
link(onEvent3,1024522:doRepeat,[(200,321)(200,328)])
link(onEvent4,10199030:onEndList,[(193,328)(193,370)(410,370)(410,328)])
}
Add(GetDataEx,13641125,196,182)
{
Angle=3
link(Data,2204106:Stream,[(55,187)])
}
Add(Math,7181297,322,259)
{
Op2=2
ResultType=0
link(onResult,12366427:doWork3,[(361,265)(361,251)(186,251)])
}
Add(HubEx,12366427,182,217)
{
link(onEvent,8348129:doPosition,[])
}
Add(HubEx,4635615,196,357)
{
Angle=3
link(onEvent,1024522:doStop,[(200,335)])
}
END_SDK
Add(Hub,9275719,511,161)
{
OutCount=3
link(onEvent1,12827354:doWork2,[(541,167)(541,118)])
link(onEvent2,3779604:doData,[(543,174)(543,209)])
link(onEvent3,598827:doWork2,[(536,181)(536,258)])
}
Add(Hub,8703109,553,154)
{
OutCount=3
link(onEvent1,12827354:doWork3,[(578,160)])
link(onEvent2,9787654:doValue,[])
link(onEvent3,598827:doWork1,[(578,174)])
}
Add(Application,6093389,595,112)
{
Wait=1
Point(onTerminate)
link(onTerminate,9129885:doWork3,[(634,118)(634,104)])
}
Add(Hub,11711312,273,140)
{
link(onEvent1,9769920:doStop,[(438,146)(438,174)])
link(onEvent2,3827780:doStop,[(298,153)(298,188)])
}
Add(Button,15189132,42,98)
{
Left=252
Top=14
Width=34
Caption="Стоп"
link(onClick,9129885:doWork2,[])
}
Add(StrCatDelim,198127,273,49)
{
Str1="Время загрузки/индексации "
Str2=" мсек"
link(onStrCatDlm,16091653:doWork2,[])
}
Add(HubEx,9129885,252,98)
{
Angle=1
link(onEvent,11711312:doEvent1,[(256,146)])
}
Add(ODialog,3944805,84,161)
{
Title="Save Dialog"
link(onExecute,7806628:doOpen,[])
}
Add(MemoryStream,7170827,245,175)
{
link(onCopy,3827780:doFor,[])
}
Add(DataToFileEx,4127981,399,161)
{
DataSize=2
Point(doPosition)
link(onGet,9769920:doHash,[])
link(Stream,6157586:Var2,[])
}
Add(Hub,180655,364,175)
{
link(onEvent1,4127981:doPosition,[])
link(onEvent2,4127981:doGet,[(389,188)(389,167)])
}
Add(Hub,15415920,182,161)
{
OutCount=5
link(onEvent1,14010202:doClear,[(228,167)(228,321)])
link(onEvent2,9718670:doTimer,[(221,174)(221,342)])
link(onEvent3,7170827:doCopy,[])
link(onEvent4,9718670:doStop,[(214,188)(214,349)])
link(onEvent5,7806628:doClose,[(207,195)(207,209)(123,209)(123,174)])
}
Add(Math,16582522,364,336)
{
OpType=2
Op2=100
ResultType=0
link(onResult,14219118:doData,[])
}
Add(HubEx,12827354,574,112)
{
link(onEvent,6093389:doProcessMessages,[])
}
Add(Memory,9787654,595,161)
{
Point(Data)
link(Data,4978821:Position,[(601,152)(636,152)(636,236)(748,236)])
}
Add(DataToFileEx,4978821,735,189)
{
Point(Position)
Point(doPosition)
link(Stream,6157586:Var3,[(741,138)])
}
Add(DoData,3779604,595,203)
{
link(onEventData,4978821:doPosition,[])
link(Data,9787654:Value,[])
}
Add(GetDataEx,6157586,399,133)
{
Angle=3
link(Data,7170827:Stream,[(356,138)(356,215)(251,215)])
}
Add(Repeat,13622019,637,259)
{
link(onRepeat,1662931:doGet,[])
}
Add(DataToFileEx,1662931,686,259)
{
Point(onRdError)
Point(Position)
link(onGet,11436920:doCompare,[])
link(Stream,9769920:VocStream,[(692,243)(468,243)])
link(onRdError,15482775:doWork1,[(725,272)])
}
Add(If_else,11436920,735,259)
{
link(onTrue,16690597:doNext,[(774,265)(774,244)])
link(onFalse,15482775:doWork2,[(774,272)(774,300)])
link(Op1,4978821:Data,[])
}
Add(HubEx,15482775,721,294)
{
Angle=2
link(onEvent,13622019:doStop,[(627,300)(627,272)])
}
Add(CounterEx,16690597,791,238)
{
Min=2
Max=1000000
Default=2
Point(doReset)
}
Add(Hub,1010477,595,252)
{
OutCount=3
link(onEvent1,16690597:doReset,[(620,258)(620,251)])
link(onEvent2,13622019:doRepeat,[])
link(onEvent3,204999:doCompare,[(620,272)(620,335)])
}
Add(HubEx,598827,574,252)
{
link(onEvent,1010477:doEvent1,[])
}
Add(If_else,204999,791,329)
{
Type=4
link(onTrue,8234335:doString,[])
link(Op1,11624451:Var2,[])
link(Op2,3089555:Value,[(804,278)(846,278)])
}
Add(Edit,15507716,798,189)
{
Left=182
Top=14
Width=57
Hint="Минимальная длина для вывода в таблицу"
Text="4"
Alignment=1
DataType=1
link(onChange,3089555:doValue,[])
}
Add(StringTable,14010202,959,308)
{
Top=43
Width=430
Height=355
Align=5
Columns=#15:Поз.Образца=140|15:Поз.Словаря=140|9:Длина=129|
Point(doSelect)
Point(doEnsureVisible)
}
Add(FormatStr,8234335,840,329)
{
DataCount=3
Mask="%1;%2;%3"
link(onFString,8212874:doEvent1,[])
link(Str1,2816362:Var3,[(846,313)])
link(Str3,11624451:Var3,[(860,306)])
}
Add(GetDataEx,15696705,315,308)
{
link(Data,3827780:Position,[])
}
Add(GetDataEx,161234,287,217)
{
Angle=3
link(Data,7170827:Size,[(258,222)])
}
Add(HubEx,16091653,315,49)
{
Angle=1
link(onEvent,14415943:doCaption,[(319,62)])
}
Add(Hub,8212874,882,329)
{
link(onEvent1,14010202:doAdd,[(907,335)(907,314)])
link(onEvent2,12094826:doOperation,[])
}
Add(Math,12094826,910,336)
{
OpType=1
Op2=1
ResultType=0
link(onResult,14010202:doEnsureVisible,[])
link(Op1,14010202:Count,[(916,327)(951,327)(951,355)(965,355)])
}
Add(GetDataEx,2816362,462,308)
{
Angle=3
link(Data,15696705:Var3,[])
}
Add(GetDataEx,11624451,791,301)
{
link(Data,16690597:Count,[])
}
Add(Memory,3089555,840,189)
{
Default=Integer(4)
}

Леонид писал(а):
... никакого терпения не хватит, у меня вот не хватило на сравнение двух файлов 1 и 0.5 Мб, пришлось останавливать
А у меня вот хватило
Сканирование аналогичных файлов (байты из RND-генератора) заняло ~ 2 минуты.
Заявленные 1Мб и 128Кб сканируются ~ 30 сек, соответственно.



О как
А то: пента.... тера.... гига....

Редактировалось 6 раз(а), последний 2020-03-14 15:55:17
карма: 9

0
Ответов: 188
Рейтинг: 2
#28: 2020-03-14 23:02:40 ЛС | профиль | цитата
Galkov писал(а):
Тоды: это делается примерно так:
Тест индексирования словаря
Поиск в индексированном словаре

Изучу спасибо!!

Редактировалось 1 раз(а), последний 2020-03-14 23:19:03
карма: 0

0
Ответов: 8887
Рейтинг: 823
#29: 2020-03-16 13:48:05 ЛС | профиль | цитата
Galkov писал(а):
Судя по энтузиазму воплощения в схему
Просто интерес потеряли, а поняли все, полагаю
А вот и схема, чтобы Galkov не обижался на нас
Архив за мегабайт с двумя парами тренировочных файлов https://forum.hiasm.com/getfile/38919

Редактировалось 1 раз(а), последний 2020-03-16 22:02:16
карма: 19

1
Голосовали:zhorik5
Ответов: 9906
Рейтинг: 351
#30: 2020-03-16 19:50:52 ЛС | профиль | цитата
А вот я стесняюсь спросить.....
............
for j:=0 to m do
begin
for k:=0 to n do
begin
_A:=2; //Два первых байта совпадают по определению
ss:=sss; //Пишем эти два байта в строку
while Fil1[Sort1[i,m]+_A]=Fil2[Sort2[i,n]+_A] do //Если следующие байты совпадают - повторяем сравнение
begin
ss:=ss + chr(Fil1[Sort1[i,m]+_A]); //Добавляем в строку совпадающий байт
_A:=_A+1; //Увеличиваем кол-во совпавших байт на единицу
if (((Sort1[i,m]+_A)>_Len1) or ((Sort2[i,n]+_A)>_Len2)) then break; //Проверяем на выход за размер файла
end;
//---------------Если кол-во совпавших байтов равно или больше установленного, выводим найденную строку и позиции на индикацию
if ((_A>=_Min) and (s<>ss)) then _hi_OnEvent(onRes, ss + ';' + int2str(Sort1[i,m]) + ';' + int2str(Sort2[i,n]));
s:=ss;
end;
end;
............
-- где используются те самые j и k
А если перестать стесняться: оно вообще-то правильно работает, или как ???


А вообще - я сильно удивлен.
Вот, скажем, ты индексируешь первый файл (в котором ищем, по терминологии ТС, словарь - это второй файл). ВСЕ позиции этого файла попадают в хеш-таблицу. Потом ты перебираешь ВСЮ хеш-таблицу и анализируешь ВСЕ позиции для заданного ключа.
Таким хитромудрым образом ты перебираешь ВСЕ позиции первого файла. И ничего другого, и только по одному разу.
Зачем вся эта хитромудрость - не пойму. Мне бы такое в голову никогда не пришло.
Ну перебери ты ВСЕ эти позиции из входного файла ПО ПОРЯДКУ. Как все белые люди...
Не, парни. такому я вас не учил.
Я говорил, что проще надо быть... Проще

--- Добавлено в 2020-03-16 19:52:07

А уж выравнивание - Netspirit-а на тебя не хватает.

Редактировалось 3 раз(а), последний 2020-03-16 19:58:56
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)