1. Куча / Говнокод #21836

    −15

    1. 1
    2. 2
    3. 3
    4. 4
    >Сложность получается лучше O(1).
    
    >Не надо бросаться грудью на амбразуру, посиди — подумай. 
    >Как оказалось, самый быстрый алгоритм — это линейный поиск и никакие map/bitset не нужны.

    Будни мамкиного питимизатора
    https://habrahabr.ru/post/317588/

    Запостил: 3.14159265, 14 Декабря 2016

    Комментарии (61) RSS

    • В кои-то веки зашёл на говношвабр и случайно тыкнул в топовую запись.
      А там Цари переобулись на C++.
      Ответить
      • O(0) или O(1/x)? Делайте ваши ставки, господа!
        Ответить
        • > O(1/x)

          При достаточно большом x задача решается без единой инструкции!
          Ответить
          • Допустим, есть массив из n элементов, из которых m имеют значение 0. Задача: выбрать элемент по случайному индексу, если он ненулевой, то остановиться, если нулевой -- повторить.
            При фиксированном m c ростом n количество итераций будет уменьшаться, т.к. вероятность встретить 0 тоже уменьшается.
            Ответить
            • А бесконечный массив обрабатывается за 0 или за минус бесконечное время?
              Ответить
            • я, конечно, вижу зелёный, но мы же знаем, что ожидаемое время работы всё же O(1 + n/m) где 0 < m <= n
              Ответить
              • Почему n/m?
                Ответить
                • да, я неправильно прочитал задачу, думал, на нулевом заканчиваем попытки. Тогда n / (n - m).
                  Ответить
              • Мне лень думать (шучу, я просто не умею), но разве O будет не матожиданием геометрического распределения, что-то типа q/p где q=m/n, p=1-q, т.е. m/(n-m)?
                Ответить
                • Да, геометрическое распределение, только мы же ищем до первой "неудачи". Твоё ожидание говорит, что при m = 0 мы не сделаем ни одной попытки, а должна быть одна.
                  Ответить
                  • "Формула для дураков" говорит, что матожидание равно вероятность провала делить вероятность успеха. Вероятность провала равна m/n. Ну а при m=0 компилятор понимает, что условие всегда ложь, и выкидывает цикл, т.е. число итераций 0.
                    Ответить
                    • > "Формула для дураков"

                      Ваша формула наверняка считает число попыток до первой "удачи", не включая саму "удачу". У нас же

                      > выбрать элемент по случайному индексу

                      Нам же нужно вернуть этот элемент, а не просто нагреть процессор, так ведь? Следовательно, "удачу" тоже считать надо, а для этого хотя бы одно движение сделать нужно.
                      https://en.wikipedia.org/wiki/Geometric_distribution#Moments_and_cumulants
                      Ответить
                      • Из анализа граничных условий (см. выше) получается, что моя формула правильнее работает при m=0. Следовательно* при n стремящемся к бесконечности она тоже правильна. Ну и потом всё твоё выражение тоже можно пронормировать на константу** C=O(n=m+epsilon), тогда в формуле Романа можно будет выделить главную часть, и мы тоже получим O(1/n)
                        * Это простое доказательство оставим для читателя
                        ** Гиперреальную
                        Ответить
                        • > правильнее работает
                          правильнее работает == подтверждает мою точку зрения?
                          Ответить
                          • Ты забываешь, что при попытке выделить бесконечный статический массив программа выпадет в OOM ещё до входа в main. Следовательно количество инструкций 0.
                            Ответить
                • E[X] = 1 / p, где p = (n - m) / n.

                  1+ из формулы можно успешно выпилить, да.
                  Ответить
            • int Ocn(int *array, int n) {
                  int s = 0;
                  for (int i = 0; i < 10/n; i++) {
                      s += array[i];
                  }
                  return s;
              }


              Чистые O(10/n) = O(1/n)!
              Ответить
              • > for (int i = 0; i < 10/n; i++)
                >Как оказалось, самый быстрый алгоритм — это линейный поиск
                Ответить
                • Линейно трахнули тебя всем Камеруном, проверь.
                  Ответить
                  • Вот вам и потеря времени. А всё почему?

                    Не надо бросаться грудью на амбразуру, посиди — подумай.
                    Ответить
          • А вдруг там множитель большой? Тогда x будет настолько большим, что для вычисления не хватит оперативки.
            Ответить
        • O(i) -- код я ещё не придумал, но он опережает все аналоги.
          Ответить
          • >O(i) -- код я ещё не придумал
            >он опережает все аналоги.
            Он работает не во времени, но в пространстве!
            Ответить
            • Производит вычисление в альтернативной вымышленной вселенной, в реальной инструкций не требуется.
              Ответить
              • В 4-векторе после преобразований Воренца время становится действительным, а пространство (координаты) - мнимыми.
                Ответить
                • То есть преобразование Воренца требует сначала преобразование Вика?
                  Ответить
        • O(-x) - когда считать лучше чем не считать
          Ответить
          • Ну это же константа, Борманд. O(-x) == O(x).
            Ответить
          • O(-x) это когда царь разработал машину времени, которая будучи запущенной одновременно с каким-то кодом, перемещает снапшот состояние ЭВМ (состояние регистров, оперативной памяти, жесткого диска и проч) в прошлое, и при этом в том состоянии уже все посчитано, т.е. задача была решена раньше, чем в той временной линии был запущен код, решающий задачу
            Ответить
            • Ну тут сложный момент есть. Варьируя задержку, можно получать любую асимптотику. Главное - отрицательная константа.
              Ответить
        • O(sqrt(1))
          Ответить
      • > А там Цари переобулись на C++.
        Экстраполяция: со временем Царь будет использовать языки всё выше и выше уровнем.
        В какой-то момент он откроет, что перфоманс программы написанной в pointfree стиле является самым царским, интринсики сменятся на GHC rewrite rules.
        Наконец он откроет для себя Wolfram Mathematica и функцию D.
        Ответить
        • > Wolfram Mathematica
          Кстати, надо будет поглядеть на код из Arrival, может, там чего весёлое найдётся
          https://pbs.twimg.com/media/CxPSgfiUsAAe-E3.jpg:large
          Ответить
          • > там чего весёлое найдётся

            Хм, врядли, там сын Вольфрама над кодом работал
            http://blog.stephenwolfram.com/2016/11/quick-how-might-the-alien-spacecraft-work/
            Ответить
        • >Экстраполяция: со временем Царь будет использовать языки всё выше и выше уровнем.
          >интринсики сменятся на GHC rewrite rules.

          Но всё-равно будет продолжать жрать кактус, пытаться "заставить инлайниться ассемблерный код".
          Ответить
    • >Как оказалось, самый быстрый алгоритм — это сортировка пузырьком, а никакие qsort и merge sort не нужны
      >Как оказалось, самая лучшая структура данных -- это массив, а никакие деревья не нужны
      >Как оказалось, самое лучшее место для хранения данных это файл, разделенный запятыми, а никакие Oracle и MS-SQL не нужны
      >Как оказалось, самый лучший issue tracker это желтые листочки на мониторе, а никакие jira/youtrack не нужны
      >Как оказалось, самый лучший программист это я, а вы все не нужны
      Ответить
      • Как оказалось, твой анус вполне может обслужить как Камерун, так и сопредельные государства.
        Ответить
        • Расширил твое сопредельное государство, проверь.
          Ответить
      • Лол! Там еще постоянно признания о неосиляторстве кобенаторики

        >Значит придётся смотреть комбинаторику, но мне это не сильно помогло, так как достаточного объёма знаний по этой теме я не имею, пришлось выписывать примерно такой же пример на бумажку и подумать.

        >Идём самым простым путём: берём boost::multiprecision::uint128 — вот его нам хватит надолго! Это из-за того, что я пользуюсь MS CL, а он просто не поддерживает uint128, как все остальные компиляторы.

        >Тут уже задача начинала надоедать, так как быстрее уже не получалось и я занялся C# версией. Всё перенёс туда. Нашёл уже готовый, написанный другим человеком UInt128 — примерно такой же простой, как и мой для C++.

        >А вот самописный map проигрывает по всем статьям Dictionary. Видимо проверки границ массивов дают о себе знать, ибо увеличение памяти ничего не даёт.

        >Дальше уже пошла совсем ерунда, даже была попытка оптимизировать сложение интринсиками, но чисто C++ версия оказалась самой быстрой. У меня почему-то не получилось заставить инлайниться ассемблерный код.
        Ответить
      • >Как оказалось, самая лучшая структура данных -- это массив, а никакие деревья не нужны

        В последнее время в прессе муссируются структуры данных. Абстрактные типы данных, структуры, указатели, списки и строки стали популярны в определенных кругах. Вирт, сосунок, написал даже целую книгу ("Алгоритмы + Структуры данных = Программы", Prentice Hall, 1976 [русский перевод - изд. "Мир", 198?]), в которой утверждает, что можно написать программу на базе структур данных, не используя другие способы. Как все настоящие программисты знают, единственной полезной структурой данных является массив. Строки, списки, структуры и наборы - это все разновидности массивов и их можно рассматривать как массивы без усложнения вашего языка приграммирования. Хуже всего с этими хитрыми типами данных то, что вы должны их описывать, а настоящие языки программирования, как мы все знаем, обладают возможностью неявного задания типа, основанного на первой букве 6-символьного имени переменной.
        Ответить
        • > неявного задания типа, основанного на первой букве 6-символьного имени переменной.
          Но это же ограничивает количество переменных целого типа, используемых в программе!
          Ответить
          • Цари не выделяют новые переменные, если можно использовать старые, это дропает пирфоманс, анскил.
            Ответить
            • Иногда старые переиспользовать нельзя.

              Серьёзно, я видел проект на фортране, где список переменных инклюдили в каждую функцию из отдельного файла.
              Ответить
            • Не только цари, я сам так в 14 лет делал.
              У меня в паскале были переменные i1, i2 .. iN, и я их переюзал.
              Не потому что мне было жалко места в стеке, а потому что определять переменную можно было только вверху, и мне было лениво туда скролиться каждый раз.
              Ответить
              • Переюзал твой ротик и скрольнулся к твоему анусу, проверь.
                Ответить
              • Хм, надо написать препроцессор с 4 командами:
                ~begin context
                ~hold x:int, y:int
                ~release x:int
                ~end context

                Соответственно, вход в контекст запилит новый список переменных, hold займёт свободную переменную из пула или создаст новую, release - освободит.

                Вроде это универсальная фигня, хватит для всех популярных языков. Дальше для разных языков - только в объявлении разница будет.
                for name, type in variables:
                  print('%s %s;\n' % (type, name)) # C
                
                for name, type in variables:
                  print('var %s;\n' % (name,)) # JS

                Для объявления указателей на функции и массивов в C/C++ можно использовать typedef, затем ~hold f:my_fun_t сработает как надо.
                Ответить
                • Запилил https://gist.github.com/1024--/9004812ef50db10f4a0d301b20db8376
                  Ответить
    • https://github.com/crea7or/EulerPowersConjecture/blob/master/EulerSharp/EulerTest/Program.cs
      Зачем класть код в функции, херачить макросы гораздо удобнее.
      Ответить
      • царская оптимизация.

        Ох, может и правы были жабоёбы, когда не завезли в свой ЯП препроцессора.
        Может быть и с C# он зря.

        Одно дело DEBUG передать, но за "#if (SEARCHMAP)" _посреди_ метода надо убивать
        Ответить
      • Программист на Сишке может написать программу на Си в любом языке программирования.
        Ответить
        • Программист даже не знаю на чём
          static mainType p5( mainType x )
          		{
          			return x * x * x * x * x;
          		}
          Ответить
          • Поржал с адской смеси стасиков, сишарпа, буста, байтоебства, препроцессора, ассемблера и простого человеческого безумия.
            Ответить
            • на сишечке писать мастер, в плюсах на шаблонах факториал посчитает, да и наза решеточке человек не последний
              Ответить

    Добавить комментарий