Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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

Option Explicit
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 объявлять так:

Declare Function DelDuplSort Lib ";DeleteDuplicate" (ByVal ListWnd As Long) As Long

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 проект кинул, посмотри.


Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам