2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 16:14 


29/05/10
15
Это становится крайне интересным)
Вопрос 1: Какое значение имеет слово бинарный, кроме как двоичный?
Утверждение 1: бинарный алгоритм - двоичный алгоритм, либо у вас с русским языком и логикой не все в порядке.
Примечание 1: Официальный бинарный алгоритм не задействует битовых операций, но может быть есть вариации?))
Вопрос 2: Давно юзали, ну скажем ildasm?)) Тогда всякий бред про современные компиляторы, и про то как они лихо делят на два отпадет сам собой)
Вопрос 3: Что значит быстрее, но неправильней? Попахивает бесовщиной)) Вам в филологи)
Утверждение 3: Единственно верный вариант - самый быстродействующий.
Вопрос 4: Вы эстонец?))
Утверждение 4: (i >> 1) + (j >> 1) - есть самый быстрый и универсальный способ, потому как проверено реальными тестами на быстродействие на разных платформах, а не словесным блудом. Универсальный в том плане, что я могу делить на два любое количество слогаемых (i >> 1) + (j >> 1) + (k >> 1) + ... не боясь переполнения, а Вы - нет.
Утверждение 5: Абсолютно согласен с тем, что мне еще учиться и учиться, и я не собираюсь останавливаться.

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 16:15 


02/07/08
322
Если я узнаю, что у меня появляются массивы именно размером более 10^9, но менее 2.2 * 10^9, то я, безусловно, просмотрю все операции с их индексами. Однако это и есть пример нетипичной ситуации.
Далее вы заговорили про НОД. До этого такой задачи не стояло. Также я не знаю, что значит "посчитать качественно". Однако если мне доверят написание такого кода, который действительно чуток к производительности, то я стану искать статьи на эту тему, так как не склонен считать, что могу придумать оптимизацию лучше, чем это было сделано до меня. В качестве примера посмотрите в интернете, как считается знак определителя матрицы 2х2 с вещественными числами (типичная задача: найти знак векторного произведения векторов на плоскости). Однажды видел в библиотеке код этой операции примерно на 300 строк. Разумеется, разбираться не стал, а просто воспользовался. Так и в вашей ситуации: здесь я не против оптимизации. Но считаю, что в каждом случае она требует обоснования. К примеру, если вы пишете алгоритм быстрой сортировки и используете средний элемент в качестве разделителя, то по скорости абсолютно одинаковыми будут алгоритмы с (i + j) / 2, (i + j) >> 1, i + (j - i) / 2 (только (i >> 1) + (j >> 1) не надо писать, потому что оно делает другую операцию).
Хитрого в записи знака произведения то, что это не является привычным интуитивно понятным кодом; нужно время, чтобы с ним разобраться. Да, кому-то хватит 10 секунд, кому-то нужна минута, но читать целиком написанный такой код - увольте. Но, как вы правильно заметили, если он спрятан в библиотеке, которой все пользуются, то этим заниматься не будут. Тесты только оставьте рядом с библиотекой, а в ней самой комментарий, что делает такая строчка, и все будут довольны.

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 16:57 
Заслуженный участник


04/05/09
4582
InterceptorTSK в сообщении #325571 писал(а):
Это становится крайне интересным)
Вопрос 1: Какое значение имеет слово бинарный, кроме как двоичный?
Утверждение 1: бинарный алгоритм - двоичный алгоритм, либо у вас с русским языком и логикой не все в порядке.
"Бинарный" может также означать алгоритм, основанный на делении пополам.

InterceptorTSK в сообщении #325571 писал(а):
Вопрос 2: Давно юзали, ну скажем ildasm?)) Тогда всякий бред про современные компиляторы, и про то как они лихо делят на два отпадет сам собой)
Не "юзал" ни разу, но про деление на два знаю.

InterceptorTSK в сообщении #325571 писал(а):
Вопрос 3: Что значит быстрее, но неправильней? Попахивает бесовщиной)) Вам в филологи)
Утверждение 3: Единственно верный вариант - самый быстродействующий.
Вы, похоже, программировали только на ассемблере, и не знаете про приоритет операций.

InterceptorTSK в сообщении #325571 писал(а):
Вопрос 4: Вы эстонец?))
Нет.

InterceptorTSK в сообщении #325571 писал(а):
Утверждение 4: (i >> 1) + (j >> 1) - есть самый быстрый и универсальный способ, потому как проверено реальными тестами на быстродействие на разных платформах, а не словесным блудом. Универсальный в том плане, что я могу делить на два любое количество слогаемых (i >> 1) + (j >> 1) + (k >> 1) + ... не боясь переполнения, а Вы - нет.
Ваше (i >> 1) + (j >> 1) даёт неправильный результат для нечётных i и j даже на ассемблере, и меня огорчает, что вы этого не видите даже после того, как вам указали на ошибку. Программист должен знать такие вещи.

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 17:01 
Заслуженный участник


04/03/09
906
InterceptorTSK в сообщении #325539 писал(а):
(i + j) / 2 есть (i >> 1) + (j >> 1)

Ну и сколько вы получите, складывая таким макаром 2 единицы?
InterceptorTSK в сообщении #325539 писал(а):
Именно оптимизированный бинарный быстрый короткий (уж не знаю уже какие слова подобрать) алгоритм здесь хотели давно,

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

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 17:23 
Заслуженный участник


09/08/09
3438
С.Петербург
InterceptorTSK в сообщении #325571 писал(а):
Вопрос 2: Давно юзали, ну скажем ildasm?)) Тогда всякий бред про современные компиляторы, и про то как они лихо делят на два отпадет сам собой)
С каких это пор промежуточный язык (IL), генерируемый компиляторами .Net, превратился в двоичный код?
Для того чтобы было понятно, кто тут несёт бред:
1. Программа на C#:
Код:
static void Main(string[] args)
{
     int x = 4;
     int y = x / 2;
     Console.WriteLine("y = {0}", y);
}

2. Сгенерированный IL:
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
  1. .method private hidebysig static void Main(string[] args) cil managed
  2. {
  3.     .entrypoint
  4.     .maxstack 2
  5.     .locals init (
  6.         [0] int32 x,
  7.         [1] int32 y)
  8.     L_0000: ldc.i4.4
  9.     L_0001: stloc.0
  10.     L_0002: ldloc.0
  11.     L_0003: ldc.i4.2
  12.     L_0004: div
  13.     L_0005: stloc.1
  14.     L_0006: ldstr "y = {0}"
  15.     L_000b: ldloc.1
  16.     L_000c: box int32
  17.     L_0011: call void [mscorlib]System.Console::WriteLine(string, object)
  18.     L_0016: ret
  19. }
  20.  
В строке 12 действительно команда div.

3. А теперь смотрим на то, что получает после загрузки кода и память и JIT-компиляции:
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
  1.         static void Main(string[] args)
  2.         {
  3.             int x = 4;
  4. 00000000  push        ebp  
  5. 00000001  mov         ebp,esp
  6. 00000003  sub         esp,18h
  7. 00000006  mov         dword ptr [ebp-4],ecx
  8. 00000009  cmp         dword ptr ds:[00239194h],0
  9. 00000010  je          00000017
  10. 00000012  call        69839DE1
  11. 00000017  xor         edx,edx
  12. 00000019  mov         dword ptr [ebp-0Ch],edx
  13. 0000001c  xor         edx,edx
  14. 0000001e  mov         dword ptr [ebp-8],edx
  15. 00000021  mov         dword ptr [ebp-8],4
  16.             int y = x / 2;
  17. 00000028  mov         eax,dword ptr [ebp-8]
  18. 0000002b  sar         eax,1
  19. 0000002d  jns         00000032
  20. 0000002f  adc         eax,0
  21. 00000032  mov         dword ptr [ebp-0Ch],eax
  22.             Console.WriteLine("y = {0}", y);
  23. 00000035  mov         ecx,64C9AB0Ch
  24. 0000003a  call        FFE00AD4
  25. 0000003f  mov         dword ptr [ebp-10h],eax
  26. 00000042  mov         eax,dword ptr ds:[02C22088h]
  27. 00000048  mov         dword ptr [ebp-14h],eax
  28. 0000004b  mov         eax,dword ptr [ebp-10h]
  29. 0000004e  mov         edx,dword ptr [ebp-0Ch]
  30. 00000051  mov         dword ptr [eax+4],edx
  31. 00000054  mov         eax,dword ptr [ebp-10h]
  32. 00000057  mov         dword ptr [ebp-18h],eax
  33. 0000005a  mov         ecx,dword ptr [ebp-14h]
  34. 0000005d  mov         edx,dword ptr [ebp-18h]
  35. 00000060  call        64CE2E2C
  36.         }
  37. 00000065  nop              
  38. 00000066  mov         esp,ebp
  39. 00000068  pop         ebp  
  40. 00000069  ret  
  41.  
Что делает команда sar в строке 18 объяснить? Или сами догадаетесь?

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 17:34 
Админ форума
Аватара пользователя


19/03/10
8952
 !  InterceptorTSK, объявляю Вам предупреждение за смесь невежества, апломба и хамства по отношению к участникам обсуждения.

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 18:15 


29/05/10
15
Господа! Без нервов) (i >> 1) + (j >> 1) - есть неверный результат) Целиком и полностью согласен) Взят из другой оперы, но очень близкой, такой что человек с мозгами в результате может исключить операцию деления почти для любого знаменателя. В случае двух слагаемых дополните единицей и все) как ее взять? посмотрите на слагаемые, проверьте их четность) Богом клянусь, не хотел тут вводить кого-либо в заблуждение)
Ну пиво пьем, что поделать)
Далее, вопрос про среду исполнения, ну это мега вопрос) Кто сказал, что, например, уважаемая всеми корпорация IBM в своей среде исполнения учтет деление на 2, и разумно заменит div shift-ом?))) Это крайне спорно. А кто сказал, что уважаемая Sun это сделала? А если ту же операцию проводить для Int64?))

(Оффтоп)

Идем далее, пример: (извините, код не оформлен, сваял только что студент)

namespace InterceptorsMediaLab
{
static class Program
{
// Метод быстрый [Fast]
private static void Fast()
{
global::System.Int32 value = 0;
global::System.Int64 ticks = global::System.DateTime.Now.Ticks;

for (global::System.Int32 a = 1; a < 100000; a++)
for (global::System.Int32 b = 1; b < 100000; b++)
// -----------
value = (a + b) >> 1;

ticks = global::System.DateTime.Now.Ticks - ticks;

global::System.Console.WriteLine(global::System.String.Format("Fast {0} {1}", ticks, value));
}
// Метод тупой [Stpd]
private static void Stpd()
{
global::System.Int32 value = 0;
global::System.Int64 ticks = global::System.DateTime.Now.Ticks;

for (global::System.Int32 a = 1; a < 100000; a++)
for (global::System.Int32 b = 1; b < 100000; b++)
// -----------
value = (a + b) / 2;

ticks = global::System.DateTime.Now.Ticks - ticks;

global::System.Console.WriteLine(global::System.String.Format("Stpd {0} {1}", ticks, value));
}

static void Main()
{
global::System.Console.Write("Press enter...");
global::System.Console.ReadLine();
for (global::System.Int32 i = 0; i < 5; i++)
{
Fast();
Stpd();
}
global::System.Console.Write("Finished...");
global::System.Console.ReadLine();
}
}
}

Результаты катастрофические:
Press enter...
Fast 150625000 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150625000 99999
Stpd 250781250 99999
Finished...

Вот и пища для ума)
Кого обидел, а вроде никто особо и не обиделся, извините)
P.S. XP Framework3.5 32bit VS2008, сам давно все излазил, дамп одинаков, понять не могу.

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 18:59 
Админ форума
Аватара пользователя


19/03/10
8952
 i  InterceptorTSK, обсуждение Вашего кода в данной теме является офтопиком. Если хотите поговорить о своей проблеме, создайте отдельную тему в подразделе "Программирование" -- может быть, кто-нибудь и откликнется.
При оформлении кода пользуйтесь тегом syntax (инструкция здесь: Как подсвечивать синтаксис).

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение30.05.2010, 19:18 
Заслуженный участник


04/05/09
4582
InterceptorTSK в сообщении #325644 писал(а):
Господа! Без нервов) (i >> 1) + (j >> 1) - есть неверный результат) Целиком и полностью согласен) Взят из другой оперы, но очень близкой, такой что человек с мозгами в результате может исключить операцию деления почти для любого знаменателя. В случае двух слагаемых дополните единицей и все) как ее взять? посмотрите на слагаемые, проверьте их четность)
Вы серьёзно считаете, что замена одного сложения и сдвига двумя сдвигами, сложением и несколькими проверками чётности сделает ваш код быстрее?

-- Вс май 30, 2010 12:23:59 --

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

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 16:37 


09/05/10
122
Ростов-на-Дону
Так как же выглядит бинарный алгоритм?Приведите пожалуйста пример,любого!

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 17:16 
Заслуженный участник


04/05/09
4582
Бинарный алгоритм вычисления НОД
Бинарный поиск

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 17:28 


09/05/10
122
Ростов-на-Дону
Не,это не бинарный алгоритм!Это вообще условно можно назвать алгоритмом!

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 17:41 
Заслуженный участник


27/04/09
28128
Почему?

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 17:57 


09/05/10
122
Ростов-на-Дону
Почему не бинарный,или почему не алгоритм?

 Профиль  
                  
 
 Re: Расширенный бинарный алгоритм
Сообщение31.08.2010, 18:26 
Заслуженный участник


04/05/09
4582
И то, и другое.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group