Куча говна / Говнокод #21836 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
>Сложность получается лучше O(1).

>Не надо бросаться грудью на амбразуру, посиди — подумай. 
>Как оказалось, самый быстрый алгоритм — это линейный поиск и никакие map/bitset не нужны.

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

Запостил: 3.14159265 3.14159265, (Updated )

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

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

        При достаточно большом x задача решается без единой инструкции!
        Ответить
        • Допустим, есть массив из n элементов, из которых m имеют значение 0. Задача: выбрать элемент по случайному индексу, если он ненулевой, то остановиться, если нулевой -- повторить.
          При фиксированном m c ростом n количество итераций будет уменьшаться, т.к. вероятность встретить 0 тоже уменьшается.
          Ответить
          • А бесконечный массив обрабатывается за 0 или за минус бесконечное время?
            Ответить
          • я, конечно, вижу зелёный, но мы же знаем, что ожидаемое время работы всё же O(1 + n/m) где 0 < m <= n
            Ответить
            • Мне лень думать (шучу, я просто не умею), но разве 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.
                          Ответить
          • 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) это когда царь разработал машину времени, которая будучи запущенной одновременно с каким-то кодом, перемещает снапшот состояние ЭВМ (состояние регистров, оперативной памяти, жесткого диска и проч) в прошлое, и при этом в том состоянии уже все посчитано, т.е. задача была решена раньше, чем в той временной линии был запущен код, решающий задачу
          Ответить
          • Ну тут сложный момент есть. Варьируя задержку, можно получать любую асимптотику. Главное - отрицательная константа.
            Ответить
    • > А там Цари переобулись на C++.
      Экстраполяция: со временем Царь будет использовать языки всё выше и выше уровнем.
      В какой-то момент он откроет, что перфоманс программы написанной в pointfree стиле является самым царским, интринсики сменятся на GHC rewrite rules.
      Наконец он откроет для себя Wolfram Mathematica и функцию D.
      Ответить
  • >Как оказалось, самый быстрый алгоритм — это сортировка пузырьком, а никакие 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 сработает как надо.
              Ответить
    • царская оптимизация.

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

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

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8