Сравнить два массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сравнить два массива

Сообщение Orastar » 30.11.2004 (Вт) 14:09

Есть задача: Нужно сравнить два массива по 10 чисел в каждом, и вывести на экран совпадения в массивах. Т.е. например и в массиве a и в массиве b есть число 7 - нужно вывести на экран кол-во совпадений и само число, которое встречается в массивах 9в данном случае совпадение одно и число 7)
Заранее спасибо за помощь.

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

Сообщение alibek » 30.11.2004 (Вт) 14:27

Ну, для начала так:
Код: Выделить всё
Dim I1 As Long, I2 As Long, C As Long
For I1 = 1 To 10
  C = 0
  For I2 = 1 To 10
    If A(I1) = B(I2) Then C = C + 1
  Next I2
  If C > 0 Then Print "Number: "; A(I1); ", count: "; C
Next I1
Lasciate ogni speranza, voi ch'entrate.

Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сообщение Orastar » 30.11.2004 (Вт) 15:56

Вроде все работает, только счетчик не накручивается - все время 1 ...

i'm pissed
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 194
Зарегистрирован: 23.10.2004 (Сб) 12:01
Откуда: irkutsk

Сообщение i'm pissed » 30.11.2004 (Вт) 17:35

покажи исходняк
by_pissed

Orastar
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 29.11.2004 (Пн) 15:41

Сообщение Orastar » 30.11.2004 (Вт) 17:37

Все, разобрался. надо было просто добавить еще одну переменую для счетчика и вынести ее за цикл. Всем спасибо.

Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Сообщение Sofist » 14.02.2007 (Ср) 11:57

Здравствуйте.. я вижу что ответом на вопрос темы стало примение цикла.. У меня тогда возникает другой вопрос. Мне необходимо сравнить элементы не одномерного массива, состоящего из 10 элементов, а два трехмерных массива с большим количеством элементов. Допустим Q1(1 to 3, 1 to 500, 1 to 800) и Q2(1 to 3, 1 to 500, 1 to 800). При сравнении, с помощью цикла, это все происходит достаточно долго, даже очень долго.. Возможно ли ускорить этот процесс?.. путем примениеня API-функции или как-нибудь по другому?..

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

Сообщение alibek » 14.02.2007 (Ср) 12:07

Это один миллион двести элементов.
При попарном сравнении будет 1440 миллиардов операций, естественно будет долго.
Если надо вести учет сравнений, то API тебе ничем не поможет. Тут оптимизация нужна и упорядочивание исходных списков.
Если же нужно определить только сам факт, равны массивы или не равны, то... CompareMemory все-равно нет, но можно сравнивать хеши или CRC. Только чтобы это имело смысл (в плане скорости сравнения), эти хеши надо вычислять до сравнения, в момент заполнения массивов.
Lasciate ogni speranza, voi ch'entrate.

Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Сообщение Sofist » 14.02.2007 (Ср) 12:20

Нет.. Сам факт что они различны не нужен.. эти два массива практически всегда различны.. Тут вся фигня состоит в том, что еще нужно определить попадает ли элемент массива Q2 в определенный интервал вокруг соответсвующего элемента массива Q1. К примеру
If Q1(1,1,1) + 5 > Q2(1,1,1) And Q1(1,1,1) - 5 < Q2(1,1,1) And_
Q1(2,1,1) + 5 > Q2(2,1,1) And Q1(2,1,1) + 5 > Q2(2,1,1) And_
Q1(3,1,1) + 5 > Q2(3,1,1) And Q1(3,1,1) + 5 > Q2(3,1,1) Tnen
И это все должно происходить быстро.. :)

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

Сообщение alibek » 14.02.2007 (Ср) 12:26

Напрямую никак, только попарным сравнением.
Оптимизируй процесс.
Lasciate ogni speranza, voi ch'entrate.

Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Сообщение Sofist » 14.02.2007 (Ср) 12:30

А в каком смысле оптимизировать процесс? Куда уж проще??

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2007 (Ср) 12:42

alibek писал(а):Если же нужно определить только сам факт, равны массивы или не равны, то... CompareMemory все-равно нет

Как это нет, когда есть?
ntdll!RtlCompareMemory
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.02.2007 (Ср) 12:51

Имелось в виду "всё равно не подходит", имхо...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Сообщение Sofist » 14.02.2007 (Ср) 13:02

tyomitch, а можно поподробнее о ntdll!RtlCompareMemory?. я человек еще далекий от тонкостей VB и пока не понимаю просто ntdll!RtlCompareMemory...

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

Сообщение alibek » 14.02.2007 (Ср) 13:07

Она тебе не поможет. Она не возвращает список отличий, она только число отличий дает.
Lasciate ogni speranza, voi ch'entrate.

Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Сообщение Sofist » 14.02.2007 (Ср) 13:11

Жаль.. ну, ладно, СПАСИБО.. хоть понял теперь в каком направлении двигаться...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2007 (Ср) 15:06

alibek писал(а):Она тебе не поможет. Она не возвращает список отличий, она только число отличий дает.

И даже его не даёт -- только положение первого отличия.
Изображение

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

Сообщение alibek » 14.02.2007 (Ср) 15:12

Разве? Я так понял, она возвращает число совпадений байт:
RtlCompareMemory returns the number of bytes that compare as equal. If all bytes compare as equal, the input Length is returned.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 14.02.2007 (Ср) 15:16

автору сюда: http://www.mathworks.com/products/matlab/
и еще изучать курс "Матричные вычисления"

вот еще по теме:
1. http://tutornet.nsu.ru/Library/Books/Ma ... %201/1.htm
2. http://www.fftw.org
3. http://met.sourceforge.net/
4. http://72.14.253.104/search?q=cache:eM6 ... lr=lang_ru
5. Ссылки на математические ресурсы: http://www.exponenta.ru/educat/links/l_educ.asp

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2007 (Ср) 19:46

alibek писал(а):Разве? Я так понял, она возвращает число совпадений байт:
RtlCompareMemory returns the number of bytes that compare as equal. If all bytes compare as equal, the input Length is returned.

Ну, действительно неоднозначно написано. Но там внутри именно cnt=count; while (*p1++==*p2++ && cnt--) ; return count-cnt; (я только что заглянул и посмотрел)
Изображение


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

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

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

    TopList