Страница: 1 | 2 |
Вопрос: VB - ListBox - Исключение дубликатов
Добавлено: 02.03.05 20:09
Автор вопроса: ZagZag | ICQ: 295002202
Ответы
Всего ответов: 23
Номер ответа: 16
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #16
Добавлено: 05.03.05 11:39
Это алгоритм quicksort. Если бы перейти от строк к указателям, можно было бы повысить скорость, но VB не позволит сортировать указатели.
Пока я тут стараюсь победить вариант со сплитом.
Забрался в dll и оттуда воюю с ним.
Пока что для листа, заполненного по алгоритму из ответа №11, удаление дубликатов и перезаполнение - 6,2 - 6,3 сек. Чуть быстрее сплита. Это без сортировки. И без эмуляции работы варианта со сплитом.
Попробую ещё с quicksort'ом указателей вариант и сымитировать vb-шный сплит.
Будет прогресс - выкладываю.
Да, ты ж ассемблера не боишься, если что ?
Номер ответа: 17
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #17
Добавлено: 05.03.05 11:41
Уточнение: алгоритм, работающий 6,2 - 6,3 сек не требует сортировки. Т.е. это полное время
Номер ответа: 18
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #18
Добавлено: 05.03.05 14:57
Выкинул я тот QuickSort когда нашел DLL-ку на PowerBasic'e для сортировки
массива... И правильно сделал!
ПОЛМИЛЛИОНА строк сортируется 4 минуты! И то, самая длинная процедура -
ПЕРЕВОД строк из массива в лискбокс (~70% времени)!
Чем меньше - тем быстрее! 50 тыс. строк сортируется... 2,75 СЕКУНДЫ!
Возник вопрос: как ускорить перевод строк массива в ЛистБокс... или может
быть постоянно работать только с массивом? (ЛистБокс-то невидимый)
Я бы давно перешел на работу с массивами, но думаю от этого увеличится
длительность добавления строк из файла, т. к. заранее неизвестно сколько
прийдется добавлять из файла (строк в ЛБ может быть или больше, или меньше
чем строк в файле)
Модуль: basListSort
Private Declare Sub SortString Lib "VBSort.dll" (ByRef arString() As String)
Public Sub SortListBox(ByVal hListBox As Long)
'Цель: Сортировка значений ListBox
'Автор: ZagZag (zagzag@xaker.ru)
'Создано: 05.03.2005 14:00
Dim arSort() As String
Dim lngIndex As Long
Dim lngCount As Long
Dim strListString As String
lngCount = SendMessage(hListBox, LB_GETCOUNT, 0, ByVal 0)
ReDim arSort(1 To lngCount) As String
For lngIndex = 0 To lngCount - 1
strListString = String$(SendMessage(hListBox, LB_GETTEXTLEN,
lngIndex, ByVal 0), vbNullChar)
SendMessage hListBox, LB_GETTEXT, lngIndex, ByVal strListString
arSort(lngIndex + 1) = strListString
Next
SendMessage hListBox, LB_RESETCONTENT, 0, 0
SortString arSort()
frmMain.pbCurrent.Max = lngCount
For lngIndex = 0 To lngCount - 1
strListString = arSort(lngIndex + 1)
SendMessage hListBox, LB_ADDSTRING, 0, ByVal strListString
If (GetTickCount Mod 500) = 0 Then
frmMain.pbCurrent.Value = lngIndex
DoEvents
End If
Next
frmMain.pbCurrent.Value = 0
Erase arSort
End Sub
Библиотечка почему-то находиться только после компиляции программы, из
ДЕБАГ-ТАЙМА не находится
Номер ответа: 19
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #19
Добавлено: 05.03.05 14:59
Ой МАФАКА! Ой мусора-то сколько в ПБэшной библиотечке, которая всего-лишь
"сортирует строковый массив"
ADVAPI32.DLL
RegOpenKeyExA
RegCloseKey
KERNEL32.DLL
CloseHandle
ExitProcess
FlushFileBuffers
FreeEnvironmentStringsA
GetCommandLineA
GetEnvironmentStringsA
GetLastError
GetModuleHandleA
GetStartupInfoA
GetSystemInfo
GetVersionExA
GlobalAlloc
GlobalFree
MultiByteToWideChar
ReadFile
SetEndOfFile
SetErrorMode
SetFilePointer
SetLastError
Sleep
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
WideCharToMultiByte
WriteFile
OLE32.DLL
CoInitialize
CoUninitialize
OLEAUT32.DLL
SafeArrayCreate
SysAllocStringByteLen
SysFreeString
SysStringByteLen
VariantClear
VariantCopy
SafeArrayGetDim
SafeArrayGetLBound
SafeArrayGetUBound
SafeArrayRedim
USER32.DLL
CreateDialogParamA
CreateWindowExA
DialogBoxParamA
Перехожу на MASM32...
Э? А по-моему гдето примерчик и на асме был по сортировке? Киньте пожалуйста
если увидите.
(zagzag2003#mail.ru)
Номер ответа: 20
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #20
Добавлено: 05.03.05 16:43
На мой взгляд 2,7 для сортировки - достаточно много. Сортировку массива из 40000 строк делал порядка за 600 мс. (на асме) (Имена файлов на винте)
Ты по-прежнему считаешь, что с сортировкой лучше?
Попробуем, ориентиры есть.
На мыло кинул тебе DeleteDuplicate.asm, скомпилируй в dll, посмотри. В процедуру передаётся только hWnd заполненного листа, остальное все в процедуре делается
Номер ответа: 21
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #21
Добавлено: 06.03.05 00:31
Вроде есть положительный сдвиг:
Исходное состояние - 50000 строк.
Получение строк из листбокса - 78 мс
Сортировка полученных строк - 47 мс
Перезаполнение листа(без дубликатов)- 380-400 мс
Итого вся операция по очистке от дубликатов - ок. 0,5 сек
При других значениях количества строк и количества повторений строк цифры естественно будут другие.
Я тебе на мыло закинул dll и исходник к ней.
Из vb объявлять так:
DelDuplSort ByVal ListBox1.hWnd
Номер ответа: 22
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #22
Добавлено: 06.03.05 02:02
Спасибо, cresta, библиотечка - хорошая.
Правда я запарился ее на мой MASM32 переводить (знаю что она уже на MASM32,
но там макросов и деклараций не хватало)
Кстати, можно наверное у нее убрать LockWindowUpdate, разве она нужна
невидимиму ЛистБоксу?
Потестил я, значит, библиотечку.. хоть она и на асме, а работает не очень
быстро
Где-то тоже слабый код есть... может при LB_INSERTSTRING? Но всеравно
спасибо!
Может еще есть такие мелкие и очень полезные библиотечки (желательно на
ассемблере). Если не жалко - кинь исходники
Номер ответа: 23
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #23
Добавлено: 06.03.05 09:27
ZagZag, ничего не путаешь? Причем здесь невидимый листбокс? Этот код работает сразу с твоим видимым листбоксом. Ни одна из твоих процедур не нужна вообще, только одна строка кода
DelDuplSort ByVal ListBox1.hWnd
Это всё.
А ты похоже создаешь невидимый листбокс, грузишь в него из видимого и затем его сортируешь/удаляешь а потом снова перегружаешь в видимый, отсюда и "тормоза".
На мыло vb проект кинул, посмотри.