Ваш любимый алгоритм и урок, который это преподавало Вам [закрылись]

Находит ли наследование из списка?

class FooCollection : List<Foo>, IList<Foo>
{
    public string Bar { get; set; }        
    //Implement IList, ICollection and IEnumerable members...
}
27
задан 4 revs, 4 users 100% 12 August 2010 в 17:51
поделиться

28 ответов

"Выполнить итерации является человеческим, для рекурсивного вызова божественный" - заключенный в кавычки в 1989 в колледже.

P.S. Отправленный Woodgnome при ожидании приглашают для присоединения

17
ответ дан Annan 28 November 2019 в 04:02
поделиться

@Krishna Kumar

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

0
ответ дан 2 revs, 2 users 80% 28 November 2019 в 04:02
поделиться

Хранение двух указателей в отдельном слове для двунаправленного связанного списка, жесткого меня урок, что можно сделать очень плохие вещи в C действительно (из-за которого консервативный GC испытает много затруднений).

0
ответ дан blabla999 28 November 2019 в 04:02
поделиться

Алгоритм, который генерирует список начал путем сравнения каждого числа с текущим списком начал, добавления его, если это не найдено, и возврат списка начал в конце. Изгиб Мышления несколькими способами, не наименьшее количество который, будучи идеей использовать частично завершенный вывод в качестве основных критериев поиска.

0
ответ дан J.T. Hurley 28 November 2019 в 04:02
поделиться

итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.

повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.

Вы знаете, что fibonacci имеет закрытое решение для формы, которое позволяет прямое вычисление результата в постоянном числе шагов, правильно? А именно, (phi <глоток> n - (1 - phi) <глоток> n ) / sqrt (5). Это всегда кажется мне несколько замечательный, что это должно привести к целому числу, но это делает.

phi является золотым сечением, конечно; (1 + sqrt (5)) / 2.

0
ответ дан DrPizza 28 November 2019 в 04:02
поделиться

Эти алгоритм Ханойских башен является одним из самых красивых алгоритмов. Это показывает, как можно использовать рекурсию для решения проблемы намного более изящным способом, чем повторяющийся метод.

, С другой стороны, алгоритм рекурсии для ряда Fibonacci и вычисления полномочий числа демонстрирует обратную ситуацию рекурсивного алгоритма, используемого ради рекурсии вместо того, чтобы обеспечить хорошее значение.

0
ответ дан Krishna Kumar 28 November 2019 в 04:02
поделиться

Для меня, простой подкачки в Kelly & Pohl Книга А по C для демонстрации вызова по ссылке зеркально отразила меня, когда я увидел его в первый раз. Я посмотрел на это и указатели, сфотографированные в место. Дословно...

void swap(int *p, int *q)
{
   int temp;

   temp = *p;
   *p = *q;
   *q = temp;
}
0
ответ дан Baltimark 28 November 2019 в 04:02
поделиться

Quicksort в Haskell:

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

, Хотя я couldn'd пишу Haskell в то время, я действительно понимал этот код и с ним рекурсия и quicksort алгоритм. Это просто сделало щелчок, и там это было...

4
ответ дан Alexander Stolz 28 November 2019 в 04:02
поделиться

Это - медленное:)

я узнал партии и о C и о компьютерах в целом путем понимания Устройство Вареных пудингов и подкачки XOR

РЕДАКТИРОВАНИЕ:

Jason Z, это - моя подкачка XOR:) прохладный не он.

1
ответ дан 3 revs 28 November 2019 в 04:02
поделиться

Для меня это - алгоритм слабой пирамидальной сортировки, потому что это показывает (1) насколько мудрая выбранная структура данных (и алгоритмы, работающие над ним), может влиять на производительность и (2) это, захватывающие вещи могут быть обнаружены даже в старых, известных вещах. (слабая пирамидальная сортировка является лучшим вариантом всех пирамидальных сортировок, который был доказан восемь лет спустя.)

2
ответ дан 2 revs 28 November 2019 в 04:02
поделиться

Quicksort: Пока я не добрался до колледжа, я никогда не подвергал сомнению, была ли Пузырьковая сортировка грубой силы самым эффективным способом отсортировать. Это просто казалось интуитивно очевидным. Но быть подвергнутым неочевидным решениям как Quicksort учило меня смотреть мимо очевидных решений видеть, доступно ли что-то лучше.

2
ответ дан Bruce Alderman 28 November 2019 в 04:02
поделиться

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

Подкачка 2 целых числа, не используя промежуточную переменную (в C++)

void InPlaceSwap (int& a, int &b) {
     a ^= b;
     b ^= a;
     a ^= b;
}
2
ответ дан Jason Z 28 November 2019 в 04:02
поделиться

Минимакс учил меня, что шахматные программы не умны, они могут просто думать, больше продвигается вперед, чем Вы можете.

3
ответ дан 2 revs 28 November 2019 в 04:02
поделиться

По некоторым причинам мне нравится Schwartzian, преобразовывают

@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] }
          map  { [$_, foo($_)] }
                @unsorted;

Где нечто ($) представляет вычисление - интенсивное выражение, которое берет $ (каждый объект списка в свою очередь) и производит соответствующее значение, которое должно быть сравнено в его пользе.

3
ответ дан Pat 28 November 2019 в 04:02
поделиться

Итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.

Для разработки - "выдумка (10) = выдумка (9) + выдумка (8)" подход означает, что выдумывают (9), будет оценен для выдумывания (8) + выдумка (7). Таким образом, оценка выдумки (8) (и для этого fib7, fib6) будет все оценена дважды.

повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.

я склонен бороться за простой, изящный код, когда я программирую, но это - алгоритм, который помог мне понять, что это не end-all-be-all для записи хорошего программного обеспечения, и что в конечном счете конечные пользователи не заботятся, как Ваш код смотрит.

3
ответ дан callingshotgun 28 November 2019 в 04:02
поделиться

По некоторым причинам Пузырьковая сортировка всегда выделялась мне. Не потому что это изящно или хорошо просто, потому что это / глупое имя, я предполагаю.

1
ответ дан Owen 28 November 2019 в 04:02
поделиться

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

6
ответ дан Henry 28 November 2019 в 04:02
поделиться

алгоритм визуализации строки Bresenham получил меня заинтересованный графическим рендерингом в реальном времени. Это может использоваться для рендеринга заполненных полигонов, как треугольники, для вещей как 3D образцовый рендеринг.

7
ответ дан spoulson 28 November 2019 в 04:02
поделиться

Кодирование методом Хаффмана было бы моим, я первоначально сделал свою собственную немую версию путем уменьшения числа битов для кодирования текста от 8 вниз к меньше, но не думал о переменном числе битов в зависимости от частоты. Тогда я нашел кодирование методом Хаффмана описанным в статье в журнале, и оно открыло много новых возможностей.

10
ответ дан angry person 28 November 2019 в 04:02
поделиться

Этот мог бы звучать тривиальным, но это было открытие для меня в то время. Я был в своем самом первом классе (VB6) программирования, и Профессор только что учил нас случайным числам, и он дал следующие инструкции: "Создайте виртуальную лотерейную машину. Предположите, что стеклянный шар, полный 100 шаров пинг-понга, отметил от 0 до 99. Выберите их случайным образом и отобразите их число, пока они не были все выбраны, никакие дубликаты".

Все остальные записали их программу как это: Выберите шар, поместите его число в "уже выбранный список" и затем выберите другой шар. Проверьте, чтобы видеть, если его уже выбранный, раз так выберите другой шар, если не помещенный его число в "уже выбранный список" и т.д.

, Конечно, к концу они делали сотни сравнений для нахождения нескольких шаров, которые не были уже выбраны. Это было похоже на отбрасывание шаров назад в банку после выбора их. Мое откровение должно было выбросить шары после выбора.

я знаю, что это звучит отупляющим образом очевидным, но это было моментом, что "переключатель программирования" был зеркально отражен в моей голове. Это было моментом, что программирование пошло от попытки выучить странный иностранный язык попытке выяснить приятную загадку. И как только я установил ту умственную связь между программированием и забавой, там не была действительно никакая остановка меня.

9
ответ дан Autodidact 28 November 2019 в 04:02
поделиться

Quicksort. Это показало мне, что рекурсия может быть мощной и полезной.

9
ответ дан 2 revs, 2 users 67% 28 November 2019 в 04:02
поделиться

Общие алгоритмы:

  • Quicksort (и это - средний анализ сложности), шоу, что рандомизация Вашего входа может быть хорошей вещью!;
  • сбалансированные деревья ( деревья AVL , например), аккуратный способ сбалансировать затраты на поиск/вставку;
  • Dijkstra и Ford-Fulkerson алгоритмы на графиках (мне нравится то, что второй имеет много приложений);
  • LZ* семья алгоритмов сжатия ( LZW, например), сжатие данных звучало как вид волшебства мне, пока я не обнаружил его (давным-давно:));
  • FFT, повсеместный (снова использованный в таком количестве других алгоритмов);
  • симплекс алгоритм, повсеместный также.

Числовой связанный:

  • алгоритм Euclid для вычисления GCD двух целых чисел: один из первых алгоритмов, простых и изящных, мощных, имеет много обобщений;
  • быстрое умножение целых чисел ( Cooley-Tukey, например);
  • повторения Newton для инвертирования / находят корень, очень мощный метаалгоритм.

связанный с теорией чисел:

  • AGM связанные алгоритмы ( примеры ): приводит к очень простым и изящным алгоритмам для вычисления пи (и намного больше!), хотя теория довольно глубока (Гаусс представил эллиптические функции и модульные формы от нее, таким образом, можно сказать, что она родила алгебраическую геометрию...);
  • решето числового поля (для целочисленной факторизации): очень сложный, но вполне хороший теоретический результат (это также идет для алгоритм AKS , который доказал, что НАЧАЛА находятся в P).

я также любил изучать квантовые вычисления ( Shor и Deutsch-Josza алгоритмы, например): это учит Вас думать из поля.

, Как Вы видите, я немного склоняюсь к ориентированным на математику алгоритмам:)

32
ответ дан 2 revs 28 November 2019 в 04:02
поделиться

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

0
ответ дан 28 November 2019 в 04:02
поделиться

Карта / уменьшение. Две простые концепции, которые сочетаются друг с другом, чтобы упростить распараллеливание множества задач обработки данных.

Ой ... и это только основа массово-параллельного индексирования:

http://labs.google.com/ paper / mapreduce.html

0
ответ дан 28 November 2019 в 04:02
поделиться

Больше всего я горжусь решением, когда писал что-то очень похожее на пакет DisplayTag. Это научило меня многому о дизайне кода, ремонтопригодности и повторном использовании. Я написал его задолго до DisplayTag, и он был заключен в соглашение о неразглашении информации, поэтому я не мог открыть его исходный код, но я все еще могу говорить об этом во время собеседований.

0
ответ дан 28 November 2019 в 04:02
поделиться

У меня нет любимого - есть так много красивых, из которых можно выбрать - но один я всегда Интересной оказалась формула Бейли – Борвейна – Плуфа (BBP) , которая позволяет вычислить произвольную цифру числа Пи без знания предыдущих цифр.

1
ответ дан 28 November 2019 в 04:02
поделиться

Алгоритм поиска кратчайших путей для всех пар Флойда-Уоршалла

procedure FloydWarshall ()
   for k := 1 to n
     for i := 1 to n
        for j := 1 to n
          path[i][j] = min ( path[i][j], path[i][k]+path[k][j] );

Вот почему это круто: когда вы впервые узнаете о задаче поиска кратчайшего пути в курсе теории графов , вы, вероятно, начнете с алгоритма Дейкстры, который решает кратчайший путь от одного источника. Поначалу это довольно сложно, но потом вы преодолеете это и полностью поняли.

Затем учитель говорит: «Теперь мы хотим решить ту же задачу, но для ВСЕХ источников». Вы думаете про себя: «О боже, это будет намного сложнее! Это будет как минимум в N раз сложнее, чем алгоритм Дейкстры !!! ».

Затем учитель дает вам Флойд-Уоршолла. И твой разум взрывается. Потом начинаешь плакать от того, насколько красиво простой алгоритм. Это просто тройной вложенный цикл. Он использует только простой массив для своей структуры данных.


Наиболее открывающим мне глаза является следующее осознание: допустим, у вас есть решение проблемы A. Тогда у вас есть более крупная «суперпроблема» B, которая содержит проблему A. Решение проблемы B может быть проще, чем решение проблемы A.

11
ответ дан 28 November 2019 в 04:02
поделиться

RSA познакомил меня с миром модульной арифметики, которую можно использовать для решения неожиданного числа из ] интересные задачи !

1
ответ дан 28 November 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: