Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Суть в следующем: есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь) будем для простоты называть их масиивами массивы проиндексированы (каждая "запись" имеет уникальный ключ) например: Массив A 1 2 3 4 5 Массив B 2 4 5 Вопрос: каким образом сравнить два массива по ключам Важно чтобы на выходе мы получили их разницу Т.е. аналог LEFT JOIN Для приведенного примера мы должны получить Массив C 1 3 Как это сделать наиболее оптимальным способом? Я имею ввиду кроме полного перебора Наверняка существуют подобные алгоритмы.. Может ткнете носом? Пока мне в голову приходит только банальный XOR Но его можно использовать для макс. 32 элементов ведь? А если к примеру элементов в массиве 200? (как в моей задаче) Вообщем жду советов, хотя бы в каком направлении копать... Сразу оговорюсь, SQL не предлагать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:09 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
если оба массива отсортированы по ключу, то в чем проблема? один проход двумя указателями по обоим массивам и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:14 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB > есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь) Это важно, например для коллекций или словарей, нужно будет сделать только по одному проходу по каждому источнику, что-бы получить искомое и не плевать на сортировку, для массива нужна сортировка данных. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:40 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Shocker.Proесли оба массива отсортированы по ключу, то в чем проблема? один проход двумя указателями по обоим массивам и все. Ну это банальный перебор. Я надеялся, что может есть более оптимальный алгоритм. Что-то типа XOR... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:43 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
типа, без сортировки Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:56 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: ЧервьVB > есть 2 массива (списка) данных (не важно как организованы - array, коллекция, словарь) Это важно, например для коллекций или словарей, нужно будет сделать только по одному проходу по каждому источнику, что-бы получить искомое и не плевать на сортировку, для массива нужна сортировка данных. Для конкретики - пусть будут две коллекции. Тогда, плевать на сортировку. Тогда, если 2 прохода, обращений к масиивам будет m+n, где m и n, соответственно размерности массивов. Но, при обходе каждого массива, мы также обращаемя к другому (с целью проверки существования данного ключа). Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений. Т.е. оптимальнее никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 15:59 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB > Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений. Ты опять скатился в "свою" терминологию. Коллекция не массив. Почитай в чем различия > необходимо сделать (m+n)*2 обращений. С какого перепугу??? Ты снова делаешь неверные выводы из-за подмены понятий. будет только один проход по одной коллекции и по окончанию будет один проход по второй коллекции. После этих, двух, проходов будет готова "разница" множеств. > Т.е. оптимальнее никак? Можно убрать один проход, но тогда "загадим" одну из коллекций :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 16:34 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
ЧервьVBНо, при обходе каждого массива, мы также обращаемя к другому (с целью проверки существования данного ключа). Вы описываете вложенные циклы При сортированных массивах делается ТОЛЬКО ОДИН проход параллельно по двум массивам и к каждому элементу каждого массива идет обращение ТОЛЬКО ОДИН РАЗ. Не вижу никакого алгоритма, который позволил бы склеить массивы НЕ ОБРАЩАЯСЬ К ЕГО ЭЛЕМЕНТАМ хотя бы один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 16:38 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: ЧервьVB > Таким образом, чтобы узнать разницу между массивами, необходимо сделать (m+n)*2 обращений. Ты опять скатился в "свою" терминологию. Коллекция не массив. Почитай в чем различия > необходимо сделать (m+n)*2 обращений. С какого перепугу??? Ты снова делаешь неверные выводы из-за подмены понятий. будет только один проход по одной коллекции и по окончанию будет один проход по второй коллекции. После этих, двух, проходов будет готова "разница" множеств. > Т.е. оптимальнее никак? Можно убрать один проход, но тогда "загадим" одну из коллекций :) Все равно я не понимаю, как будет по ОДНОМУ обращению к элементам коллекции. Простой пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так 10, "4" 40, "9" т.е. аналог XOR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:08 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
ЧервьVB, Считывается первый элемент одного и второго массива. Если индексы равны, продвигаемся вперед по обоим массивам. Если у второго массива ключ больше, элемент пераого массива заносим в результат и двигаем указатель только первого массива. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:16 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB > Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так добавляй данные из одной коллекции в другую, если ошибка добавления, значит такой ключ добавлен в коллекцию, если ошибки нет, значит элемента не было, нужно сохранить его как часть результата. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:23 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Shocker.ProЧервьVB, Считывается первый элемент одного и второго массива. Если индексы равны, продвигаемся вперед по обоим массивам. Если у второго массива ключ больше, элемент пераого массива заносим в результат и двигаем указатель только первого массива. Вот и все. 1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает. 2. А если коллекции не отсортированы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:30 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: ЧервьVB > Как мне получить col3 (сравнение идет по ключам!), которая будет выглядеть так добавляй данные из одной коллекции в другую, если ошибка добавления, значит такой ключ добавлен в коллекцию, если ошибки нет, значит элемента не было, нужно сохранить его как часть результата. Отличная, рабочая идея и не зависит от отсортированности. Но дорого по времени. Это полный обеих обоих коллекций + попытка добавить на каждой итерации и отлов ошибки. Как раз весь смысл моего изыскания - наиболее оптимальный алгоритм. Т.к. у меня эти проверки должны выполняться для большого числа коллекций от 100 элементов. Коллекции динамические, т.е. постоянные Add и Remove И в каждый момент времени должна вычисляться разница ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:34 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
ЧервьVB1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает. Никак. Нужно тогда в коллекцию добавлять не простой элемент, а экземпляр собственного класса с блекджеком и шлюхами. ЧервьVB2. А если коллекции не отсортированы? Ну я сразу сказал, что мой метод для сортированных коллекций. Алгоритмов оптимальной сортировки существует великое множество. Вариант Игоря интересен, хотя, по сути, этот те же вложенные циклы, только их не надо писать на VB, они внутри класса уже зашиты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:36 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
ЧервьVBКоллекции динамические, т.е. постоянные Add и Remove Ага. Можно добавлять новый элемент в нужное место коллекции, чтобы сохранять ее отсортированной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:37 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Shocker.ProЧервьVBКоллекции динамические, т.е. постоянные Add и Remove Ага. Можно добавлять новый элемент в нужное место коллекции, чтобы сохранять ее отсортированной. Если уж совсем заморачиваться - строить индексы наподобие индексов в SQL (B-деревья) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:38 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB Shocker.Pro тебе говорил о массивах, на которых ты упорно настаивал. > 1. Как прочитать ключ у i-го элемента? Такая конструкция: col(i).key не работает. Не работает у кого??? Почитай наконец что из себя представляет коллекция и словарь. Такая конструкция сработает со словарем. И кстати, такая конструкция у меня работает и с коллекцией, только я держу в коллекциях самописные классы, у которых в обязательном порядке есть свойство Key > 2. А если коллекции не отсортированы? А как ты предлагаешь сортировать коллекции и словари??? Ты снова начинаешь путать особенности структур хранения данных . Сортировка важна если ты будешь держать свои данные в массивах Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:40 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro > хотя, по сути, этот те же вложенные циклы, Нет, там не происходит полного перебора. По ключу строится хеш и этот хеш пытается добавлятся во что-то наподобии B-tree Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:47 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: Shocker.Pro > хотя, по сути, этот те же вложенные циклы, Нет, там не происходит полного перебора. По ключу строится хеш и этот хеш пытается добавлятся во что-то наподобии B-tree Точно? Тогда твой алгоритм это может оказаться наиболее оптимальным вариантом. А вообще, я вот, что подумал. Зачем сравнивать два массива целиком, если они динамические? Надо сразу обрабатывать Add и Remove и строить разностный массив на ходу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:51 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB Для твоих 100 элементов это ерунда, в конце концов проверь. и кстати почитай , как раз по твоему вопросу :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 17:55 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, Шокер, Спасибо! Пока алгоритм игоря мне кажется для коллекций наиболее оптимальным, если б-дерево. Еще можно использовать справочник наверное. Там вроде есть exist. Так что наличие ошибки можно не проверять. ПыСы за ссылку спасибо, прочту пожалуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 18:02 |
|
||
|
Сравнение массивов (списков) данных по ключу??
|
|||
|---|---|---|---|
|
#18+
> Автор: ЧервьVB > Это полный обеих обоих коллекций А я тебе о чем говорил изначально? Но ты упорно хотел сделать вложенные циклы :) > + попытка добавить на каждой итерации Это конечно может быть затратно, нужно проверять. Хотя у меня по нескольку коллекций до нескольких тысяч элементов доходят, и поиск реализован перебором(наверное стоит переделать) и нормально работает, тормозов не замечаю. > и отлов ошибки. Считай это некой разновидностью GoTo Label И может, действительно пересмотреть логику работы, как советовал Shocker.Pro, и вычислятиь разницу именно в момент Add или Remove в методах своего класса-коллекции??? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 18:10 |
|
||
|
|

start [/forum/topic.php?fid=60&fpage=120&tid=2159456]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 380ms |

| 0 / 0 |
