powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнение массивов (списков) данных по ключу??
22 сообщений из 22, страница 1 из 1
Сравнение массивов (списков) данных по ключу??
    #36828431
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть в следующем:

есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь)
будем для простоты называть их масиивами

массивы проиндексированы (каждая "запись" имеет уникальный ключ)


например:


Массив A

1
2
3
4
5


Массив B

2
4
5


Вопрос: каким образом сравнить два массива по ключам
Важно чтобы на выходе мы получили их разницу

Т.е. аналог LEFT JOIN


Для приведенного примера мы должны получить

Массив C

1
3


Как это сделать наиболее оптимальным способом?
Я имею ввиду кроме полного перебора

Наверняка существуют подобные алгоритмы..
Может ткнете носом?



Пока мне в голову приходит только банальный XOR
Но его можно использовать для макс. 32 элементов ведь?

А если к примеру элементов в массиве 200? (как в моей задаче)

Вообщем жду советов, хотя бы в каком направлении копать...
Сразу оговорюсь, SQL не предлагать.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828452
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если оба массива отсортированы по ключу, то в чем проблема?
один проход двумя указателями по обоим массивам и все.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828549
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB
> есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь)

Это важно, например для коллекций или словарей, нужно будет сделать только по одному проходу по каждому источнику,
что-бы получить искомое и не плевать на сортировку, для массива нужна сортировка данных.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828556
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proесли оба массива отсортированы по ключу, то в чем проблема?
один проход двумя указателями по обоим массивам и все.

Ну это банальный перебор.
Я надеялся, что может есть более оптимальный алгоритм.

Что-то типа XOR...
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828604
так,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
типа, без сортировки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim V1 As Variant
Dim V2 As Variant
Dim i As Integer
V1 = Array( 8 ,  5 ,  9 ,  4 )
V2 = Array( 5 ,  9 )
For i = LBound(V1) To UBound(V1)
  If UBound(Filter(V2, V1(i))) = - 1  Then
    Debug.Print V1(i)
  End If
Next i
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828614
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
> Автор: ЧервьVB
> есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь)

Это важно, например для коллекций или словарей, нужно будет сделать только по одному проходу по каждому источнику,
что-бы получить искомое и не плевать на сортировку, для массива нужна сортировка данных.




Для конкретики - пусть будут две коллекции.

Тогда, плевать на сортировку.
Тогда, если 2 прохода, обращений к масиивам будет m+n, где m и n, соответственно размерности массивов.

Но, при обходе каждого массива, мы также обращаемя к другому (с целью проверки существования данного ключа).

Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений.

Т.е. оптимальнее никак?
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828724
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB
> Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений.

Ты опять скатился в "свою" терминологию. Коллекция не массив. Почитай в чем различия

> необходимо сделать (m+n)*2 обращений.

С какого перепугу??? Ты снова делаешь неверные выводы из-за подмены понятий. будет только один проход по одной коллекции
и по окончанию будет один проход по второй коллекции. После этих, двух, проходов будет готова "разница" множеств.

> Т.е. оптимальнее никак?

Можно убрать один проход, но тогда "загадим" одну из коллекций :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828742
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧервьVBНо, при обходе каждого массива, мы также обращаемя к другому (с целью проверки существования данного ключа).

Вы описываете вложенные циклы

При сортированных массивах делается ТОЛЬКО ОДИН проход параллельно по двум массивам и к каждому элементу каждого массива идет обращение ТОЛЬКО ОДИН РАЗ. Не вижу никакого алгоритма, который позволил бы склеить массивы НЕ ОБРАЩАЯСЬ К ЕГО ЭЛЕМЕНТАМ хотя бы один раз.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828834
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
> Автор: ЧервьVB
> Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений.

Ты опять скатился в "свою" терминологию. Коллекция не массив. Почитай в чем различия

> необходимо сделать (m+n)*2 обращений.

С какого перепугу??? Ты снова делаешь неверные выводы из-за подмены понятий. будет только один проход по одной коллекции
и по окончанию будет один проход по второй коллекции. После этих, двух, проходов будет готова "разница" множеств.

> Т.е. оптимальнее никак?

Можно убрать один проход, но тогда "загадим" одну из коллекций :)








Все равно я не понимаю, как будет по ОДНОМУ обращению к элементам коллекции.


Простой пример:




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim col1 As Collection
Dim col2 As Collection
Dim col3 As Collection

Dim i As Long

Set col1 = New Collection
col1.Add  10 , "4"
col1.Add  20 , "5"
col1.Add  30 , "7"

Set col2 = New Collection
col2.Add  20 , "5"
col2.Add  30 , "7"
col2.Add  40 , "9"




Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так


10, "4"
40, "9"



т.е. аналог XOR
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828855
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧервьVB,

Считывается первый элемент одного и второго массива.
Если индексы равны, продвигаемся вперед по обоим массивам. Если у второго массива ключ больше, элемент пераого массива заносим в результат и двигаем указатель только первого массива. Вот и все.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828872
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB
> Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828887
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЧервьVB,

Считывается первый элемент одного и второго массива.
Если индексы равны, продвигаемся вперед по обоим массивам. Если у второго массива ключ больше, элемент пераого массива заносим в результат и двигаем указатель только первого массива. Вот и все.

1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает.

2. А если коллекции не отсортированы?
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828899
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос
> Автор: ЧервьVB
> Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так

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



Отличная, рабочая идея и не зависит от отсортированности.
Но дорого по времени.
Это полный обеих обоих коллекций + попытка добавить на каждой итерации и отлов ошибки.

Как раз весь смысл моего изыскания - наиболее оптимальный алгоритм.
Т.к. у меня эти проверки должны выполняться для большого числа коллекций от 100 элементов.
Коллекции динамические, т.е. постоянные Add и Remove
И в каждый момент времени должна вычисляться разница
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828904
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧервьVB1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает.

Никак. Нужно тогда в коллекцию добавлять не простой элемент, а экземпляр собственного класса с блекджеком и шлюхами.


ЧервьVB2. А если коллекции не отсортированы?

Ну я сразу сказал, что мой метод для сортированных коллекций. Алгоритмов оптимальной сортировки существует великое множество.

Вариант Игоря интересен, хотя, по сути, этот те же вложенные циклы, только их не надо писать на VB, они внутри класса уже зашиты
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828906
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧервьVBКоллекции динамические, т.е. постоянные Add и Remove
Ага.
Можно добавлять новый элемент в нужное место коллекции, чтобы сохранять ее отсортированной.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828910
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЧервьVBКоллекции динамические, т.е. постоянные Add и Remove
Ага.
Можно добавлять новый элемент в нужное место коллекции, чтобы сохранять ее отсортированной.

Если уж совсем заморачиваться - строить индексы наподобие индексов в SQL (B-деревья)
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828915
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB

Shocker.Pro тебе говорил о массивах, на которых ты упорно настаивал.

> 1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает.

Не работает у кого??? Почитай наконец что из себя представляет коллекция и словарь.
Такая конструкция сработает со словарем. И кстати, такая конструкция у меня работает и с коллекцией, только я держу в
коллекциях самописные классы, у которых в обязательном порядке есть свойство Key

> 2. А если коллекции не отсортированы?

А как ты предлагаешь сортировать коллекции и словари???

Ты снова начинаешь путать особенности структур хранения данных . Сортировка важна если ты будешь держать свои
данные в массивах

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828931
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> хотя, по сути, этот те же вложенные циклы,

Нет, там не происходит полного перебора. По ключу строится хеш и этот хеш пытается добавлятся во что-то наподобии B-tree


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828944
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shocker.Pro
> хотя, по сути, этот те же вложенные циклы,
Нет, там не происходит полного перебора. По ключу строится хеш и этот хеш пытается добавлятся во что-то наподобии B-tree


Точно? Тогда твой алгоритм это может оказаться наиболее оптимальным вариантом.


А вообще, я вот, что подумал.
Зачем сравнивать два массива целиком, если они динамические?
Надо сразу обрабатывать Add и Remove и строить разностный массив на ходу.
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828953
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB

Для твоих 100 элементов это ерунда, в конце концов проверь.
и кстати почитай , как раз по твоему вопросу :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828967
ЧервьVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,
Шокер,


Спасибо!

Пока алгоритм игоря мне кажется для коллекций наиболее оптимальным, если б-дерево.
Еще можно использовать справочник наверное. Там вроде есть exist. Так что наличие ошибки можно не проверять.


ПыСы
за ссылку спасибо, прочту пожалуй
...
Рейтинг: 0 / 0
Сравнение массивов (списков) данных по ключу??
    #36828989
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ЧервьVB
> Это полный обеих обоих коллекций

А я тебе о чем говорил изначально? Но ты упорно хотел сделать вложенные циклы :)

> + попытка добавить на каждой итерации

Это конечно может быть затратно, нужно проверять. Хотя у меня по нескольку коллекций до нескольких тысяч элементов
доходят, и поиск реализован перебором(наверное стоит переделать) и нормально работает, тормозов не замечаю.

> и отлов ошибки.

Считай это некой разновидностью GoTo Label


И может, действительно пересмотреть логику работы, как советовал Shocker.Pro, и вычислятиь разницу именно в момент Add
или Remove в методах своего класса-коллекции???

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнение массивов (списков) данных по ключу??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]