purebasic.info

PureBasic forum
Текущее время: Сб мар 28, 2020 11:12 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Пн мар 16, 2020 1:15 pm 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 931
Благодарил (а): 100 раз.
Поблагодарили: 31 раз.
Пункты репутации: 5
идея и реализация sergey2400
почему он на меня свалил выкладывание, у него спрашивайте :D
моё участие свелось к мелким правкам и тестингу, файл 255ххх коротких строк, у него на хорошей машине 250+-мс, на моей 400+-мс, файл для сортировки один у обоих
акела сортирует примерно столько же, но Ё кидает на задворки
в инете ни чего не нашёл по правильной сортировке, на сайтах сортируют тоже неправильно!!!, вот такие дела, выросло поколение егешников


если кто ещё может ускорить, давайте ваши идеи
-----
его описалово идеи
Цитата:
На всякий опишу как делаю:
Есть русский алфавит, буквы: А-Я и а-я, в юникоде он занимает 66 значений (33 буквы Х2), то есть значения: 1025, 1040-1103, 1105.
Есть массив с 65535 элементами и в каждом элементе соответствующее значение символа юникода (тоже от 0 до 65535).
Мы выискиваем 66 значений в массиве отведённые для русского алфавита и заполняем их так, чтоб весть алфавит А-а Б-б занял эту последовательность в порядке нужном нам (АаБбВвГгДдЕеЁёЖж...), чтоб 'А' стала не 1040, а 1025 (раньше всех), а 'Ё' стала между 'Е' и 'Ж'.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
    ;Преобразование до сортировки (алгоритм оставляет большие буквы):
    a(1040)=  1025 ; Если в тексте найдётся А, чтоб она считалась раньше всех ей назначаем самое первое значение последовательности - 1025
    a(1072)=  1040 ; Маленькой а назначим второе значение последовательности 1040
    a(1041)=  1041 ; Б назначим 1041
    a(1073)=  1042 ; б назначим 1042
    a(1042)=  1043 ; В
    a(1074)=  1044 ; в
    a(1043)=  1045 ; Г
    a(1075)=  1046 ; г
    a(1044)=  1047 ; Д
    a(1076)=  1048 ; д
    a(1045)=  1049 ; Е
    a(1077)=  1050 ; е
    a(1025)=  1051 ; Ё Вот её и вставляем по середине
    a(1105)=  1052 ; ё Её следующей
    a(1046)=  1053 ; Ж Дальше опять по порядку
    a(1105)=  1052 ; ж
     
    ;Обратное преобразование:
     
    a(1025)=  1040 ; Какую мы буква посадили на значение 1025? Это буква А, возвращаем ей её законное значение 1040
    a(1040)=  1072 ; ну и так далее, просто меняем местами (по сравнению с первым преобразованием) значения и индексы массива.
    a(1041)=  1041
    a(1042)=  1073
    a(1043)=  1042
    a(1044)=  1074
    a(1045)=  1043
    a(1046)=  1075
    a(1047)=  1044
    a(1048)=  1076
    a(1049)=  1045
    a(1050)=  1077
    a(1051)=  1025
    a(1052)=  1105
    a(1053)=  1046
     
 
 
 


а это собственно код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
    DisableDebugger
    EnableExplicit
     
    Global Dim c$(0), Dim a(65535), a1=0, *f, j=0, v=0, l=0, q=0, time=0, t1.f=0, file$="", fileEnd$="", s$="", simvol=0
     
    Restore stM ; переключатель, делать вначале LCASE() - значение: stM    или или нет - тогда значение: stBM
     
    file$ = "D:\sys\alph_all.txt"  ; Путь к начальному словарю
    fileEnd$ = "D:\sys\alph_all_end.txt"  ; Путь к отсортированному словарю
    time = GetTickCount_()                ; замер времени работы
     
    Procedure change()
      For q=0 To j
        *f= @c$(q)
        l=*f + (Len(c$(q))-1) *2
        For simvol = *f To l Step 2
         
          PokeU(simvol, a(PeekU(simvol)))
        Next simvol
      Next q
    EndProcedure
    Procedure reed()
      Read.u a(1025)
      For q= 1040 To 1103
        Read.u a(q)
      Next q
      Read.u a(1105)
    EndProcedure
     
      ;Создаём новый словарь; открываем начальный словарь и словами из него заполняем массив.
      If ReadFile(0, file$)        ; Открываем  начальный словарь.
        v=ReadStringFormat(0)      ; определяем формат и кодировку словаря
        ReDim c$(Lof(0))           ; создаём массив с запасом
        If CreateFile (1, fileEnd$, v ) ; Создаём отсортированный словарь
        While Eof(0) = 0
          c$(j)=ReadString(0, v) ; читается в массив слова из словаря
          j+1
        Wend
        j=j-1
      ReDim c$(j) ; отрезаем неиспользованный участок массива c$() для устранения хвоста с нулевыми словами.
     
      ;подготавливаем массив символов a() для замещения символов на новый лад. он используется для выбора символа по индексу.
     
      For q=0 To 65535
        a(q) = q ; все симлволы оставляем на месте
      Next q
      reed() ; теперь замещаем только русские Бол и Мал.
     
      change() ; Замещаем буквы во всех словах находящихся в массиве c$(), для обмана сортировки Purebasic (насчёт буквы ё)
     
      SortArray(c$(), #PB_Sort_Ascending) ; сортируем словарь встроенной быстрой сортировкой
     
      reed() ;подготавливаем массив символов a() для восстановления изначальных символов.
     
      change() ; Восстанавливаем буквы во всех словах находящихся в массиве c$(), чтобы вернуть настоящие буквы на место.
     
      For q=0 To j
        WriteStringN(1, c$(q), v) ; записываем все слова из массива в отсортированный словарь
      Next q
     
      CloseFile(1) ;закрываем отсортированный словарь
      DataSection
       
        ;секция символов замещения (большие и маленькие на большие и маленькие)
        stBM:
       Data.u 1051, 1025, 1041, 1043, 1045, 1047, 1049, 1053, 1055, 1057, 1059, 1061, 1063, 1065, 1067, 1069  
        Data.u 1071, 1073, 1075, 1077, 1079, 1081, 1083, 1085, 1087, 1089, 1091, 1093, 1095, 1097, 1099, 1101    
        Data.u 1103, 1040, 1042, 1044, 1046, 1048, 1050, 1054, 1056, 1058, 1060, 1062, 1064, 1066, 1068, 1070
        Data.u 1072, 1074, 1076, 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1102, 1105, 1052
       
        ;секция символов восстановления (большие и маленькие на большие и маленькие)
        Data.u 1040, 1072, 1041, 1073, 1042, 1074, 1043, 1075, 1044, 1076, 1045, 1077, 1025, 1105, 1046, 1078
        Data.u 1047, 1079, 1048, 1080, 1049, 1081, 1050, 1082, 1051, 1083, 1052, 1084, 1053, 1085, 1054, 1086
        Data.u 1055, 1087, 1056, 1088, 1057, 1089, 1058, 1090, 1059, 1091, 1060, 1092, 1061, 1093, 1062, 1094
        Data.u 1063, 1095, 1064, 1096, 1065, 1097, 1066, 1098, 1067, 1099, 1068, 1100, 1069, 1101, 1070, 1102, 1071, 1103
       
        ;секция символов замещения (большие и маленькие на только маленькие)
        stM:
       Data.u 1078, 1072, 1073, 1074, 1075, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087  
        Data.u 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103    
        Data.u 1105, 1072, 1073, 1074, 1075, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087
        Data.u 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1105, 1078
       
        ;секция символов восстановления ("большие" и маленькие на только маленькие)
        Data.u 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086
        Data.u 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103
        Data.u 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086
        Data.u 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103
       
      EndDataSection
     
      ;готово
      t1.f =(GetTickCount_() - time);/1000  замер времени
      MessageRequester("", " Время работы кода в миллисекундах : " + t1)  
      MessageRequester("", "Отсортированный словарь - создан")
    Else
      MessageRequester("", "Не удалось создать отсортированный словарь")
    EndIf
     
    CloseFile(0)               ;
      Else
        MessageRequester("Information","Невозможно открыть начальный словарь!")
    EndIf
 
 
 


от LCASE() пытался его отговорить, но он таки её присобачил, это ведь убъёт текст, весь текст будет маленькими буквами, не вижу в этом ни какого смысла


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2020 2:16 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 401
Благодарил (а): 1 раз.
Поблагодарили: 20 раз.
Пункты репутации: 0
ссылка на словарь будет?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2020 8:10 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Такой большой массив и только под русские символы?
Может таблицу в данных лучше. :roll:
PS:Да и замер времени лучше делать отдельно по этапам ,или ты мильён раз откроешь файл под словарь......

Вот затести. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
Procedure change()
  Protected adresslov.l=j*4;по массиву
 
 ;сохраним для уверенности регистры
  !push ebx
  !push edx
  !push ecx
  !push edi
!mov ecx,-4
!mov dword ebx,[a_c$];начальный адрес массива с словами
!mov dword edx,[a_a];массив символов замены
!cikl:
!add dword ecx,4
         !mov dword edi,[ebx+ecx];адреса слов в массиве по смещению
     !cmp word [edi],0
     !jz wuiti;если слово пустое или конец перестановки то выходим с цикла
         ;
          !cikl2:;меняем символы
           !xor eax,eax;получить номер символа и расширить до .w до .i предварительно чистим для старших разрядов в 0
           !mov word ax,[edi]
           ;
           !mov word ax,[edx+eax];взять символ с массива по номеру предыдущего
           !mov word [edi],ax;вставить как замену предыдущего
           ;
           !add dword edi,2;перемистить указатель на следующий символ
           !cmp word [edi],0
           !jnz cikl2;если не достигли (00)=указатель конца строки то повторяем цикл замены символа  
     !wuiti:  
 !cmp dword ecx,[p.v_adresslov+16]
 !jnz cikl
 ;
 !pop edi
 !pop ecx
 !pop edx
 !pop ebx
EndProcedure
 


Вобщем с асмом как кампилятор с компилит может что будет и не так, а по задумке вот переделал. :D
PS:что бы меньше делать массив можно сдвинуть к 0 первый нужный элемент. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
Global Dim c$(10)
Global Dim m(65535)
 
m(48)=57
m(49)=56
m(50)=55
m(51)=54
m(52)=53
m(53)=52
m(54)=51
m(55)=50
m(56)=49
m(57)=48
 
c$(0)="0123456789"
c$(1)="0123456789"
 
 
Procedure.i change(adresmassivaslov.i,countslov.i,adresmassivasimvolovzameny.i)
  Protected i.i
  Protected  *Unicode.Unicode
 For i=0 To countslov
   *Unicode.Unicode=@c$(i)
    If *Unicode\u<>0
       cikl:
      *Unicode\u=m(*Unicode\u)
       *Unicode+2
       If *Unicode\u<>0
        Goto cikl
       EndIf
    EndIf
Next
EndProcedure
 
 
 
change(@c$(0),1,@m(0))
 
 
Debug c$(0)
Debug c$(1)
 



Последний раз редактировалось Сергейчик Пн мар 16, 2020 10:46 pm, всего редактировалось 4 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2020 9:57 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6607
Благодарил (а): 34 раз.
Поблагодарили: 229 раз.
Пункты репутации: 61
newJS писал(а):
давайте ваши идеи

Советы я люблю давать!
Значит так.
1. Все слова быстренько считываем в Связный список.
2. Сортируем штатно SortList
3. Видим, что слова с 'Ё' в начале списка, а слова с 'ё' в конце списка.
4. Вставляем при помощи InsertElement в порядке следования в правильное место, а именно
если Ё, Asc(слова) > 1045, а если с ё начинается, то >1077.
5. Новый исправленный Список печатаем в файл.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2020 11:50 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 552
Благодарил (а): 37 раз.
Поблагодарили: 75 раз.
Пункты репутации: 2
В идеале конвертировать бы строку в число, сортировать по числам. Порядок установить можно любой. Но я не добился полноценной функции преобразования. Вот пример.

Вот ещё нашёл пример преобразования в числа. Но всё же он также имеет ограничение по максимальному числу, которое зависит от числа символов в базе и длине конвертируемой строки. Как вариант преобразовывать первые 12 символов строки и переводить эти 12 символов в нижний регистр. При этом сортировка будет до 12-го символа без учёта регистра.

С bigint.pbi получилось идеально, вот.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 6:53 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 931
Благодарил (а): 100 раз.
Поблагодарили: 31 раз.
Пункты репутации: 5
jobless писал(а):
ссылка на словарь будет?

сей словарь делали для проверки орфо в справке
этот словарь делал я из нескольких словарей, и изначально сортировку делали под него, в последний момент добавили большие буквы
alph_all одним файлом
https://yadi.sk/d/0h-19P62uG3tUQ
само собой, ни кто не гарантирует отсутствие ошибок
есть слова с буквой Ё, 60ххх слов, надо?
Сергейчик писал(а):
что бы меньше делать массив можно сдвинуть к 0 первый нужный элемент.

это не даёт эффекта, а в тексте могут оказаться любые символы, сей вопрос обсуждался
Сергейчик писал(а):
Такой большой массив и только под русские символы?

задача стояла правильно сортировать русский текст
Сергейчик писал(а):
Может таблицу в данных лучше.

с этого начинал, оказалось медленей
kvitaliy писал(а):
5. Новый исправленный Список печатаем в файл.

ты забыл что Ё и внутри слов есть, и она тоже неправильно сортируется, эти строки как ловить?

а за всё остальное, пинайте автора :D , пусть сам отмазывается :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 7:51 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6607
Благодарил (а): 34 раз.
Поблагодарили: 229 раз.
Пункты репутации: 61
newJS писал(а):
kvitaliy писал(а):
5. Новый исправленный Список печатаем в файл.

ты забыл что Ё и внутри слов есть, и она тоже неправильно сортируется, эти строки как ловить?


Забыл написать, что внутренние "ё" нужно заменить на "е", ну если это не сильно критично. Обычно так и есть, не критично, если это не уроки по русскому языку и не фамилии в документах.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 10:37 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 931
Благодарил (а): 100 раз.
Поблагодарили: 31 раз.
Пункты репутации: 5
kvitaliy писал(а):
Забыл написать, что внутренние "ё" нужно заменить на "е", ну если это не сильно критично. Обычно так и есть, не критично, если это не уроки по русскому языку и не фамилии в документах.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 11:54 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 194
Благодарил (а): 73 раз.
Поблагодарили: 24 раз.
Пункты репутации: 4
Всем здравствуйте!
Сергейчик писал(а):
Такой большой массив и только под русские символы?
Может таблицу в данных лучше. :roll:
PS:Да и замер времени лучше делать отдельно по этапам ,или ты мильён раз откроешь файл под словарь......


Массив сделан таким большим, чтоб вместить все возможные символы, что позволило сильно упростить цикл замены (нет никаких проверок, переходов и тд), что дало ускорение данного участка кода до 10 раз (от первоначального варианта).

За код на FASM спасибо, я им интересуюсь очень, постигаю так сказать. НО, основной тормоз в данном коде - это собственные подпрограммы пурика, которые вызываются на уровне ASM (смотрел листинг, закоментировал некоторые вызовы и сопутствующие манипуляции со стеком). Пробовал заменять переменные регистрами, но толку мало, так как при вызове подпрограмм используется стек... при этом переносимость и читаемость кода будет под вопросом.

Время замерял по участкам кода (мс):

110 загрузка в массив
0 - подготовка массива a()
0 - подготовка массива а()
16 - замещение букв в массиве с$()
46 - сортировка
16 - восстановление букв в массиве с$()
46 - запись в файл
249 всего

Итого: есть смысл ускорять только "загрузка в массив" и "запись в файл". На мой не сильно опытный взгляд, чтоб двигаться дальше можно только совсем отказаться от строкового массива и работать с ReadData(), и сотворить быструю сортировку на ASM, и работать непосредственно в памяти. Но это будет совсем другой код, для других целей. Мне кажется, что для обработки 1 файла пофигу 1 секунда или 3...


Последний раз редактировалось sergey2400 Вт мар 17, 2020 1:06 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 12:34 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 552
Благодарил (а): 37 раз.
Поблагодарили: 75 раз.
Пункты репутации: 2
Если делать методом подмены символов, то не проще ли открыть файл и в цикле сначала подменить с помощью ReplaceString набор от "А" до "Е" набором от "1" до "Z", потом прочитать в массив, сортировать, объединить и снова ReplaceString в обратном порядке. Не слишком ли замудрёно что-то там через указатели, метки?

jobless писал(а):
ссылка на словарь будет?
поддерживаю, как вы хотите ускорить, если у нас не на чем тестить? Должен быть такой же несортированный словарь.

260 мс это медленно? Четверть секунды. Как я понимаю сортировка словаря происходит при добавлении в него слова? Может в этом случае стоит вставлять его в позицию, а не сортировать весь список.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 12:57 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6607
Благодарил (а): 34 раз.
Поблагодарили: 229 раз.
Пункты репутации: 61
newJS писал(а):
которой просто нет в инете

Потому, что ни кто и не заморачивается, всем пофиг :D

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 1:04 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 194
Благодарил (а): 73 раз.
Поблагодарили: 24 раз.
Пункты репутации: 4
AZJIO писал(а):
Если делать методом подмены символов, то не проще ли открыть файл и в цикле сначала подменить с помощью ReplaceString набор от "А" до "Е" набором от "1" до "Z", потом прочитать в массив, сортировать, объединить и снова ReplaceString в обратном порядке. Не слишком ли замудрёно что-то там через указатели, метки?

jobless писал(а):
ссылка на словарь будет?
поддерживаю, как вы хотите ускорить, если у нас не на чем тестить? Должен быть такой же несортированный словарь.

260 мс это медленно? Четверть секунды. Как я понимаю сортировка словаря происходит при добавлении в него слова? Может в этом случае стоит вставлять его в позицию, а не сортировать весь список.


Строковые функции сильно медленнее, чем работа напрямую с памятью через указатели, особенно на подустаревших AMD.
Изначальный рабочий код, использующий встроенные функции Пурика для посимвольной проверки слов - был в десятки раз медленнее. 260, да и 1000мс - это в большинстве случаев достаточный результат.
Стояла задача: иногда, после добавления в словарь очередной порции слов (посредством какого либо текстового редактора), отсортировать словарь и пользоваться им дальше. newJS решил поделиться кодом, может кому пригодится. За остальным - к Профессору newJS :D .


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2020 6:49 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср июн 18, 2014 6:34 pm
Сообщений: 198
Благодарил (а): 3 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Цитата:
Сортировка русского текста с учётом буквы Ё
Матерщину что-ли собрались сортировать?
На эту букву ничего другого не припомню.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср мар 18, 2020 5:41 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 931
Благодарил (а): 100 раз.
Поблагодарили: 31 раз.
Пункты репутации: 5
AZJIO писал(а):
поддерживаю, как вы хотите ускорить, если у нас не на чем тестить? Должен быть такой же несортированный словарь.

да любым сортировщиком пройди и получишь не сортированный

Дегтярёв писал(а):
Матерщину что-ли собрались сортировать?
На эту букву ничего другого не припомню.

в приведённом словаре есть более 60ххх слов с этой буквой, и есть отдельный файл, и мат вроде не попадался
в теме дважды сказано зачем это делали

sergey2400 писал(а):
newJS решил поделиться кодом, может кому пригодится. За остальным - к Профессору newJS :D .

код твой, ты и отмазывайся :D

AZJIO писал(а):
Если делать методом подмены символов, то не проще ли открыть файл и в цикле сначала подменить с помощью ReplaceString набор от "А" до "Е" набором от "1" до "Z", потом прочитать в массив, сортировать, объединить и снова ReplaceString в обратном порядке. Не слишком ли замудрёно что-то там через указатели, метки?

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

кусок карты, ключ-искомая буква, число от фени, главное последовательность
Код:
1
2
3
4
5
dic("а")=34:dic("б")=35:dic("в")=36:dic("г")=37:dic("д")=38:dic("е")=39:dic("ё")=40:dic("ж")=41
dic("з")=42:dic("и")=43:dic("й")=44:dic("к")=45:dic("л")=46:dic("м")=47:dic("н")=48:dic("о")=49
dic("п")=50:dic("р")=51:dic("с")=52:dic("т")=53:dic("у")=54:dic("ф")=55:dic("х")=56:dic("ц")=57
dic("ч")=58:dic("ш")=59:dic("щ")=60:dic("ъ")=61:dic("ы")=62:dic("ь")=63:dic("э")=64:dic("ю")=65
dic("я")=66


кусок массива, индекс соответствует букве, а число от фени
Код:
1
2
3
4
5
dic(1072)=133:dic(1073)=134:dic(1074)=135:dic(1075)=136:dic(1076)=137:dic(1077)=138:dic(1105)=139
dic(1078)=140:dic(1079)=141:dic(1080)=142:dic(1081)=143:dic(1082)=144:dic(1083)=145:dic(1084)=146
dic(1085)=147:dic(1086)=148:dic(1087)=149:dic(1088)=150:dic(1089)=151:dic(1090)=152:dic(1091)=153
dic(1092)=154:dic(1093)=155:dic(1094)=156:dic(1095)=157:dic(1096)=158:dic(1097)=159:dic(1098)=160
dic(1099)=161:dic(1100)=162:dic(1101)=163:dic(1102)=164:dic(1103)=165



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 19, 2020 3:43 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 552
Благодарил (а): 37 раз.
Поблагодарили: 75 раз.
Пункты репутации: 2
newJS
Если вы не ждёте ответа, то скорее всего вы хотели похвалиться, а нас раскрутили на ответы, я даже библиотеку bigint.pbi выучил за ночь и функцию конвертирования в числа переделал. Но всё оказалось пшик, автору не надо, автор хотел лишь показать, что его функция быстрее, типа попробуй обгони. Я обычно в таких случаях честно признаюсь, что мне не нужен ответ, пост не в форме просьбы помощи и даже не в форме "пользуйтесь enjoy", а просто делюсь, быть может кому пригодится и не претендую что сделал идеально. Хотя бы для поддержания легенды можно выложить образец для теста. Да, я могу поискать базы орфографии, в AkelPad она в бинарном виде, у Notepad++ вроде подходит, но там другой тип и размер меньше, в нём 7 тыс. против заявленных 65 тыс. строк, не возможно ощутить задержку в пол-секунды. Сортировать что-то в AkelPad? То есть писать скрипт, например, чтобы он с книги экспортировал слова, удалив дубликаты, чтобы получить примерный список аналогичный вашему? Вы хотите максимально создать проблемы для теста? И это с просьбой помочь ускорить?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB