Как правильно организовать словарь?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Как правильно организовать словарь?

Сообщение kibernetics » 29.01.2017 (Вс) 3:00

Добрый день!
Такое дело, есть некая последовательность чисел, непостоянной длины. Например, "7,12,33,4,6,15,22"

И есть описывающие последовательность шаблоны. Например:
Chain, Ratio, Name
"12,4,17,19,2,9,7,10"; 2; "Serie_1"
"12,3,4,6,15"; 4; "Serie_2"

Мне надо найти шаблон, все числа из которого встречаются в последовательности. В идеале я должен по очереди, начиная с самых длинных шаблонов перебирать вхождения чисел в последовательность. Если совпали вхождения всех чисел, я "запоминаю" этот шаблон, удаляю совпавшие числа из последовательности и ищу следующий шаблон к оставшимся числам.
Шаблонов, порядка 200.
Хранил я их так:
Dim temp(2,200) As String '200 шаблонов, 0-Chain, 1-Ratio, 2-Name
temp(0,0) = "12,4,17,19,2,9,7,10"
temp(1,0) = "2"
temp(2,0) = "Serie_1"
... и так до 200.

Затем, перебирал массив, создавал класс, и пихал в коллекцию.
Появляется новый шаблон, по длине он должен размещаться выше всех, ну или где-то в середине, например. И тут опа, снова переназначать место в массиве с учётом длины? - просто жесть.
И так 600 строк описания массива шаблонов в процедуре зрелище не для слабонервных, так ещё и с сортировкой по длине косяк в случае с массивом, ведь, самые длинные должны быть по убыванию.

Как быть? Как обычно хранят словарь шаблонов? Может в строке, через запятую? А потом сплитить в массив? А, или пихать как пихал, но потом забабахать сортировку массива? Посоветуйте что-нибудь пожалуйста.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как правильно организовать словарь?

Сообщение Teranas » 29.01.2017 (Вс) 5:06

Можно подключить базу, она позволит и сохранять-загружать, и имеет достаточно гибкий механизм сортировки… (как вариант)
У многих табличных контролов есть встроенные механизмы и сохранения, и сортировки, можно использовать их…
Если делать всё вручную, то надо сортировать сразу при вводе…
Человек потом всё равно догадывается, что нужно подобное выносить или в *.INI файл, или базу, или реестр, в зависимости от задачи.
Тогда в подобном коде необходимость отпадает.
С уважением, Андрей.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как правильно организовать словарь?

Сообщение pronto » 29.01.2017 (Вс) 5:28

Здравствуй. kibernetics!
Сделай, пожалуйста, несколько уточнений о характере данных:
1. Максимальная длина шаблона/последовательности;
2. Максимальные числа в шаблонах/последовательностях.
O, sancta simplicitas!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как правильно организовать словарь?

Сообщение kibernetics » 29.01.2017 (Вс) 11:41

pronto,
1. Длина 19
2. Диапазон 0-37

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как правильно организовать словарь?

Сообщение pronto » 31.01.2017 (Вт) 11:54

kibernetics писал(а):Мне надо найти шаблон, все числа из которого встречаются в последовательности

Шаблон [3, 5, 8] считается найденным для последовательности [1, 3, 4, 5, 8]?
O, sancta simplicitas!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как правильно организовать словарь?

Сообщение kibernetics » 31.01.2017 (Вт) 18:15

pronto писал(а):
kibernetics писал(а):Мне надо найти шаблон, все числа из которого встречаются в последовательности

Шаблон [3, 5, 8] считается найденным для последовательности [1, 3, 4, 5, 8]?

да.
потом, из последовательности убираются эти числа, и остаётся [1,4]
и уже перебираются остальные шаблоны, ищется тот, где есть два числа 1 и 4.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как правильно организовать словарь?

Сообщение pronto » 01.02.2017 (Ср) 11:34

Здравствуй, kibernetics!
Поиграйся с проектом. Надеюсь, это то, что надо :)
Вложения
Шаблоны.rar
(3.23 Кб) Скачиваний: 164
O, sancta simplicitas!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Как правильно организовать словарь?

Сообщение ALX_2002 » 03.02.2017 (Пт) 0:45

А такой вариант хуже ? Лишние преобразования из строки в массив и обратно или я неправильно понял задачу ?
Код: Выделить всё
Option Explicit

Private Type Template
    Chain As String
    Ratio As Long
    Name As String
End Type

Private Sub Form_Load()

    Me.AutoRedraw = True
   
    Form1.FontSize = 10
    Form1.ScaleMode = vbPixels
    Me.Move Me.Left, Me.Top, 640 * Screen.TwipsPerPixelX, 480 * Screen.TwipsPerPixelY
   
    Dim Templates(1 To 3) As Template, _
        sSequence As String, _
        sModifiedSequence As String, _
        i As Long
   
    sSequence = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"
   
    Print "Исходная последовательность """ & sSequence & """" & vbCrLf
   
    With Templates(1)
        .Chain = "5,8,13"
        .Ratio = 2
        .Name = "Serie_1"
    End With
   
    With Templates(2)
        .Chain = "1,12,70"
        .Ratio = 4
        .Name = "Serie_2"
    End With
   
    With Templates(3)
        .Chain = "6,14,9"
        .Ratio = 6
        .Name = "Serie_3"
    End With
   
    Print "Перебор шаблонов..."
   
    For i = LBound(Templates) To UBound(Templates)
        If ProcessChain(sSequence, Templates(i).Chain, sModifiedSequence) Then
            Print "Найдено соответствие с шаблоном """ & Templates(i).Name & """ - [" & Templates(i).Chain & "]"
            sSequence = sModifiedSequence
            Print "Последовательность изменена: """ & sSequence & """" & vbCrLf
        Else
            Print "Последовательность не соответствует шаблону """ & Templates(i).Name & """ - [" & Templates(i).Chain & "]" & vbCrLf
        End If
    Next
   
End Sub


Function ProcessChain(sSequence As String, sChain As String, Optional sModifiedSequence As String) As Boolean
    Dim aChain() As String, aSequence() As String, i As Long, j As Long, bFound As Boolean, lMatches As Long
    aChain = Split(Replace(sChain, " ", ""), ",")
    aSequence = Split(Replace(sSequence, " ", ""), ",")
    sModifiedSequence = ""
    For i = LBound(aSequence) To UBound(aSequence)
        bFound = False
        For j = LBound(aChain) To UBound(aChain)
            If aSequence(i) = aChain(j) Then
                lMatches = lMatches + 1
                bFound = True
                Exit For
            End If
        Next
        If Not bFound Then sModifiedSequence = sModifiedSequence & "," & aSequence(i)
    Next
    sModifiedSequence = Mid(sModifiedSequence, 2)
    ProcessChain = lMatches = UBound(aChain) - LBound(aChain) + 1
End Function


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как правильно организовать словарь?

Сообщение alibek » 03.02.2017 (Пт) 9:12

kibernetics писал(а):pronto,
1. Длина 19
2. Диапазон 0-37

При таких ограничениях я бы использовал битовые маски.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как правильно организовать словарь?

Сообщение kibernetics » 03.02.2017 (Пт) 16:24

pronto, а что это за функция?
Код: Выделить всё
Public Function ArrayExists(ByVal APtr As Long) As Boolean
Dim IsEx As Boolean
GetMem4 APtr, VarPtr(IsEx)
ArrayExists = IsEx <> 0
End Function


она ищет что-то в массиве без перебора?

ALX_2002, саня привет!

alibek, тоже привет! для 19-ти чисел не слишком длинная бит-последовательность будет? Хотя, нет, я наверное не так себе представляю эту идею.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как правильно организовать словарь?

Сообщение pronto » 03.02.2017 (Пт) 17:17

Это функция определяет, инициализирован массив или нет. Хотел использовать её для определения факта, что шаблонов не найдено, но потом передумал и переделал процедуру на функцию, чтобы она возвращала количество найденных шаблонов.
Должен отметить, что функция ищет все возможные шаблоны без отсеивания найденных чисел в последовательности. Чтобы это реализовать нужно:
а) либо сортировать шаблоны по длине, если состав шаблонов меняется редко, а входная последовательность часто. Естественно, после добавления нового шаблона тоже нужно будет их сортировать;
б) либо сортировать подмножество найденных шаблонов по длине и уже среди них искать уникальные, если состав шаблонов меняется часто, а входная последовательность редко. При таком подходе нет необходимости держать шаблоны в отсортированном порядке.
ЗЫ Если присмотреться, то мой вариант уже использует битовые маски. Для такой задачи это самый простой и эффективный способ организации и поиска. Основная идея в том, что число представляется положением бита. Например, число 23 не записывается как отдельная переменная, а устанавливается 23-й бит в «1».
O, sancta simplicitas!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList