Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сравнение массивов / 20 сообщений из 20, страница 1 из 1
11.01.2005, 15:16
    #32859363
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Не подскажет ли кто, как сравнить два массива ?
В Java я могу воспользоваться Array.Equals, в Cи есть memcmp. Есть ли что нибудь такое в C# ? (Array.Equals не помогает, судя по всему он сравнивает по ссылке)
...
Рейтинг: 0 / 0
14.01.2005, 14:54
    #32865261
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Судя по всему такой фичи в шарпе нету :(
Чем дальше использую шарп тем больше понимаю, что си\++ и джава более функциональны.
...
Рейтинг: 0 / 0
14.01.2005, 15:33
    #32865394
Сравнение массивов
Aleksey_tСудя по всему такой фичи в шарпе нету :(
Чем дальше использую шарп тем больше понимаю, что си\++ и джава более функциональны.

Есть такая фича - голова на плечах называется. От языка не зависит.

PS: Как вариант реализации сравнения массивов в c#:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool CompareStringArray(string[] arr0, string[] arr1)
{
  if ( arr0.Length != arr1.Length ) return false;
  for ( int i = 0; i < arr0.Length; i++)
    if ( arr0[i] != arr1[i]) return false;
  return true;
}

...
Рейтинг: 0 / 0
14.01.2005, 15:40
    #32865415
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Да, чегой-то не выходит сравнить :(
Но если очень надо, то:


На скорую руку получилось следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class MyArray: System.Collections.ArrayList
	{
		public MyArray()
		{
			
		}
		public bool CompareWithArray(ArrayList b)
		{
			
			if (this.Count == 0 && b.Count==0) return true;
			if (this.Count != b.Count)
			{
				return false;
			}
			else
			{
				for (int i=0; i<this.Count; i++)
				{
					if (this[i].Equals(b[i])==false) return false;
				}
			}
			return true;
		}
	}

Долго не тестил, но вроде работает по крайней мере для простых типов (int, string и тп)

-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.
...
Рейтинг: 0 / 0
14.01.2005, 16:41
    #32865586
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
Спасибо за помощь, но хотелось бы что то поэффективнее.
Мне вот предлагали через MemoryStream реализовать, но оказалось не лучше чем for...if

>Есть такая фича - голова на плечах называется. От языка не зависит.
:)
...
Рейтинг: 0 / 0
14.01.2005, 16:46
    #32865602
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
To: M234

>Да, чегой-то не выходит сравнить :(
Сравнить то можно, хотелось бы как можно поэффективнее.
Но все равно спасибо за помощь.
...
Рейтинг: 0 / 0
14.01.2005, 17:23
    #32865680
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
> Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
> Спасибо за помощь, но хотелось бы что то поэффективнее.

А для чего, если не секрет, два совершенно одинаковых массива по 10 Мб???
...
Рейтинг: 0 / 0
14.01.2005, 17:26
    #32865685
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Aleksey_tВы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)


И очень быстро !!! :)
К томуже сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.
...
Рейтинг: 0 / 0
14.01.2005, 17:32
    #32865695
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
> Вы извините, но 10 Мб данных сравнивать через for...if - это круто !!! :)
> Спасибо за помощь, но хотелось бы что то поэффективнее.

Если массивы так велики, то почему бы не использвать msde?
Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
14.01.2005, 17:39
    #32865711
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
M234сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.

Ну, можно хэши целочисленные сравнивать - скорость возрастет в разы... только просто array тогда не подойдет.
...
Рейтинг: 0 / 0
14.01.2005, 17:41
    #32865713
www.fun4me.narod.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
>> Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

Скорость будет ниже, потому что MSSQL не учитывает порядок элементов в массиве. Здесь сложность o(n). А в MSSQL будет o(n*log(n))
...
Рейтинг: 0 / 0
14.01.2005, 18:04
    #32865745
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
www.fun4me.narod.ru>> Скорость сравнения средствами MSSQL с использованием индексов на порядок выше чем в той же джабе.

Скорость будет ниже, потому что MSSQL не учитывает порядок элементов в массиве. Здесь сложность o(n). А в MSSQL будет o(n*log(n))

Т.е.? Ты считаешь, что простой перебор быстрее сравнения по индексам?

Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
declare @c0 int, @c1 int

select @c0 = count(*) from arr0
select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

-- Массивы идентичны, если @c0 = @c1

где FK_arr_val - форент на массив значений (я думаю, несовместимые друг с другом объекты ты сравнивать не собираешься?)
...
Рейтинг: 0 / 0
14.01.2005, 18:06
    #32865751
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Код: plaintext
1.
2.
3.
4.
5.
6.
declare @c0 int, @c1 int

select @c0 = count(*) from arr0
select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

-- Массивы идентичны, если @c0 = @c1

Да, совсем забыл - первичный ключ тоже надо включить в индекс:

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val and arr0.PK = arr1.PK)
...
Рейтинг: 0 / 0
14.01.2005, 18:11
    #32865758
www.fun4me.narod.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
>> Т.е.? Ты считаешь, что простой перебор быстрее сравнения по индексам?

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

Плюс, когда мы делаем

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

Мы должны перебрать все элементы массива arr1 хотя бы один раз. Разве нет?
...
Рейтинг: 0 / 0
14.01.2005, 18:18
    #32865769
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
www.fun4me.narod.ruПлюс, когда мы делаем

select @c1 = count(*) from arr1 inner join arr0 on (arr0.FK_arr_val = arr1.FK_arr_val)

Мы должны перебрать все элементы массива arr1 хотя бы один раз. Разве нет?

нет. мы должны перебирать индексы. целочисленные. ~ 4 байта на одну запись. А данные по этому индексу могут быть хоть километрового размера - нам безразлично, что они из себя представляют :-)
...
Рейтинг: 0 / 0
14.01.2005, 18:19
    #32865771
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
M234
И очень быстро !!! :)
К томуже сравнение массивов, тем более разнородных объектов - всегда перебор.
Не вижу другого пути. Ежели кто знает - поделитесь.

Даа, я одну деталь упустил (т.к. надеялся что в шарпе есть что то типа джававского Array.Equals). Данные однородные: массив байтов.
И судя по всему другого варианта нет как простой перебор.
...
Рейтинг: 0 / 0
14.01.2005, 18:26
    #32865781
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Roman S. Golubin
нет. мы должны перебирать индексы. целочисленные. ~ 4 байта на одну запись. А данные по этому индексу могут быть хоть километрового размера - нам безразлично, что они из себя представляют :-)

Хааа, перебирать то мы должны индексы, но ~ 4 байта это ~ ссылка на данные в карте записей, а размер ключа индекса равен размеру полей по которым индекс построен :) Если не верите, почитайте в MSDN, кстати обычные индексы в MS SQL созданы на основе улучшенного B-дерева.
Так что в любом случае мы должны перебрать все элементы массива arr1 хотя бы один раз.
...
Рейтинг: 0 / 0
14.01.2005, 21:58
    #32865961
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Aleksey_tХааа, перебирать то мы должны индексы, но ~ 4 байта это ~ ссылка на данные в карте записей, а размер ключа индекса равен размеру полей по которым индекс построен :) Если не верите, почитайте в MSDN, кстати обычные индексы в MS SQL созданы на основе улучшенного B-дерева.
Так что в любом случае мы должны перебрать все элементы массива arr1 хотя бы один раз.

Хмм... я представляю себе табличку (или даже набор табличек), в которых лежат записи о каких-то объектах, и у которой есть сурогатный первичный ключ (4 байта). Массив создается добавлением ссылки на сурогатный ключ в таблички arr0 и arr1. После этого соответствие массивов легко проверяется по индексу, построенному по 4-х байтному полю.

PS: На самом деле, я не могу представить себе задачи, где пришлось бы более бестолково сравнивать два массива по 10 метров. Я еще мог бы понять, если бы было нужно найти, например, с какого места они начинают расходиться. Но просто сравнить??!! - ну, допустим, они не равны - какое знание ты получишь из этого? А если равны, то что тогда?

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

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
14.01.2005, 23:49
    #32866029
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Aleksey_tДаа, я одну деталь упустил (т.к. надеялся что в шарпе есть что то типа джававского Array.Equals). Данные однородные: массив байтов.
И судя по всему другого варианта нет как простой перебор.

Тестим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
static void Main(string[] args) {

  byte[] arr0 = new byte[10000000];
  byte[] arr1 = new byte[10000000];

  System.Security.Cryptography.RandomNumberGenerator rng = System.Security.Cryptography.RandomNumberGenerator.Create();

  rng.GetBytes(arr0);

  Array.Copy(arr0, arr1, arr0.Length);

  DateTime ds;
  DateTime de;
  TimeSpan ts;

  ds = DateTime.Now;

  int i = 0;
  while(( i < arr0.Length ) && ( arr0[i] == arr1[i] )) i++;
  bool result = (i == arr0.Length);

  de = DateTime.Now;


  ts = de - ds;

  System.Diagnostics.Debug.WriteLine(ts.ToString());

}

Результат: 00:00:00.0801152

Скорость сравнения примерно 120 метров в секунду. Не впечатляет?
И это на смешном ноутбуке... полностью два едентичных массива по 10 метров. Если бы расхождение было в первом мегабайте, то таких проверок можно было бы делать от сто штук в секунду :-))

--
WBR, Roman S. Golubin

PS: А я, думая, что ты сравниваешь сложносоставные объекты, начал еще распинаться про msde :-)
...
Рейтинг: 0 / 0
17.01.2005, 19:21
    #32868810
Aleksey_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение массивов
Роман,
Огромное спасибо за советы.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сравнение массивов / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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