Сравнение двух массивов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сравнение двух массивов

Сообщение gjghjc » 13.02.2008 (Ср) 22:07

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

Ищу соответсвие массивов методом половинного деления (кажется это так называется когда не перебираются все элементы массива, а постепенно сужаются границы поиска делением пополам размерности массива )

Делаю так.
Определяю верхнюю и нижнюю границу А().
1. Если В(i) > последнего элемента А() то пишу значение В(i) в лог-файл
2. Если В(i) < первого элемента А() то пишу значение В(i) в лог-файл
3. Если В(i) = A(j) то производятся некие действия, какие неважно, этот кусок работает.
4. Если В(i) лежит в пределах значений массива А() но его значение отсутсвует в массиве А() то вот тут я и поймал клина...

Для примера
А (1,2,3,5,6,7,8,9)
В (0,1,2,4,7,10)
В()=0, В()=10 я нахожу, В()=1, В()=2,В()=7 тоже а вот с В()=4 как-то неполучается.
Помогите кто чем может :oops: :oops: :oops:
Утро добрым не бывает!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 13.02.2008 (Ср) 22:49

Нужно найти все элементы массива В() которых нет в массиве А().

Бежишь фором по всему массиву B и проверяешь есть ли элемент B(i) в массиве A. Если нет пишешь его в массив C. Задача простая, но если это правильное условние
#define ROFL 0xDDDD

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 14.02.2008 (Чт) 10:02

DirectXManiac
Сейчас я так и делаю, но это как-то не красиво :) Хочется поизящней что-ли.
Утро добрым не бывает!

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

Сообщение alibek » 14.02.2008 (Чт) 11:07

Ну поставь базу данных, выгрузи массивы в таблицы и выбери запросом.
Lasciate ogni speranza, voi ch'entrate.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.02.2008 (Чт) 11:47

GSerg предлагал когда-то:
создаешь коллекцию и добавляешь в неё значения одного из массивов - первый цикл
и потом идешь по второму массиву и пытаешься добавить значения, ну и обрабатываешь удачи/неудачи попыток добавления как нужно - второй цикл
как ключ используешь значения из массивов
и все ;-)
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 14.02.2008 (Чт) 13:17

alibek
Пробовал, но моих познаний в SQL не хватило на составление такого запроса :( Изначально данные и берутся из двух dbf таблиц. Правда эти таблицы сейчас расположены на разных дисках
Igor_123
Если дашь толковые ссылки как работать с коллекциями буду очень признателен.
Я так понимаю что в твоем варианте я буду пытыться добавить элементы из второго массива в коллекцию в которой находятся элементы первого. Если такой элемент есть то возникат ошибка если нет то он добавляется и я должен буду отловить это добавление? Но дело в том что если элемента B(i) нет в первом массиве то это грубейшая ошибка и добавлять его в первый ни в коем случае нельзя.
Утро добрым не бывает!

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

Сообщение alibek » 14.02.2008 (Чт) 13:59

select *
from b
where b.id not in (select id from a)
Lasciate ogni speranza, voi ch'entrate.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.02.2008 (Чт) 15:18

Толковых ссылок не дам, потому, что не знаю. Коллекция это аналог С++ -ого STL set
вот пример:
Код: Выделить всё
Private Sub Command1_Click()
Dim mCol As New Collection
Dim a(1 To 10) As Long
Dim b(1 To 10) As Long
Dim c(1 To 10) As Long
Dim i As Long, j As Long
Dim bFlag As Boolean
' Сначала инициализируем массивы и заполняем значениями первого массива коллекцию
For i = 1 To 10
    a(i) = i
    mCol.Add a(i), CStr(a(i))
    b(i) = i + 2
Next i
'В массиве два элемента не совпадают с остальными b(9) = 11 b(10) = 12
'получаем их
On Error GoTo labErr
j = 0
For i = 1 To 10
' Ставим флаг успешного добавления
    bFlag = True
'    Пробуем добавить, если такой элемент есть, попадаем в обработчик ошибок, где сбрасываем флаг
'    иначе добавление прошло успешно и запоминаем элемент
    mCol.Add b(i), CStr(b(i))
    If bFlag Then
        j = j + 1
        c(j) = b(i)
    End If
Next i
For i = 1 To j
    Debug.Print c(i)
Next i
Exit Sub

labErr:
If Err.Number = 457 Then
    bFlag = False
    Resume Next
End If
End Sub
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 14.02.2008 (Чт) 17:01

А чего изящно? Зачем? Скорость важна?
#define ROFL 0xDDDD

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 14.02.2008 (Чт) 18:03

DirectXManiac Ну конечно :) Скорость она всегда важна :)

Все! Победил. Я же говорил что просто сидел и тупил, а нужно было включить мозг.

1. Условие выхода из цикла
Код: Выделить всё
Do
Loop Unil (UpLim - LowLim) <= 1

а не
Код: Выделить всё
Do Unil (UpLim - LowLim) <= 1
Loop


2 Перед выходом проверяем такое условие
Код: Выделить всё
UpLim - LowLim <= 1 AND В(i) < A(UpLim)  AND B(i) > A(LowLim)
,
то следовательно этот элемент массива кривой и его значение пишется в лог.
Огромное спасибо DirectXManiac, alibek, Igor_123 за то что помогли включить мой мозг. :)
Утро добрым не бывает!


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 122

    TopList