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

    +118

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    int function BinarySearch (Array A, int Lb, int Ub, int Key);
      begin
      do forever
        M = (Lb + Ub)/2;
        if (Key < A[M]) then
          Ub = M - 1;
        else if (Key > A[M]) then
          Lb = M + 1;
        else
          return M;
        if (Lb > Ub) then
        return -1;
      end;

    [color=green]Бинарный поиск это поиск, на который затрачивается в 2 раза меньше времени[/green]
    http://algolist.manual.ru/search/bin_search.php

    Запостил: crastinus, 28 Сентября 2013

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

    • Ну и что с ним не так? Кроме того, что он, при наличии повторяющихся элементов, возвращает не первый и не последний из них, а какой-нибудь (что уже рассматривалось на этой неделе http://govnokod.ru/13852)?
      Ответить
    • и в нем-таки содержится один из древнейших багов.
      внимание на строчку №04
      Ответить
      • Потенциальное переполнение при n > 2^(N-2), где N - разрядность инта? Для алгоритма на псевдокоде, показывающего общую идею, имхо, это не баг.

        P.S. Где-то тут уже обсуждались непереполняющиеся алгоритмы для поиска среднего арифметического... Кажется, Царь еще в этом участвовал.
        Ответить
        • > Потенциальное переполнение при n > 2^(N-2), где N - разрядность инта?
          именно

          > Кажется, Царь еще в этом участвовал.
          эпично, а я пропустил. нетрудно будет выковырять линк на обсуждение?
          Ответить
          • Пока нашел вот этот тред: http://www.govnokod.ru/12815#comment173370. Но это не тот...
            Ответить
          • А вот тот, с Царём: http://govnokod.ru/13183#comment181887
            Ответить
        • Как по мне так это вовсе не баг. Для такого переполнения необходимо, чтобы размер массива был больше миллиарда. Это около 4Гб памяти. Даже не скомпилируется массив такого размера.
          Ответить
          • > Это около 4Гб памяти.
            [spoiler]на x86_64 в сишке и жабе инт остается 32-битным.[/spoiler]
            Ответить
          • У нас в 2017 массивы и не такие бывают. Бигдата, все дела...
            Ответить
      • да нахуй такие большие массивы
        Ответить
        • Размер и индексы массива в знаковых интах держат только анскильные питушки.

          > да нахуй такие большие массивы
          Причем не просто большие массивы, а большие упорядоченные массивы.
          Ответить
        • > да нахуй такие большие массивы
          одно дело, когда у тебя приложение, и ты полностью контролируешь данные.
          другое дело, когда у тебя библиотека (скажем, опенсорс на гитхабе) и ты не знаешь, как ее будут иметь использовать.
          а скажем, ты подключаешь чью-то зависимость, а там баг - из-за которого раз в миллиард лет ты попадаешь на миллиард баксов и это произошло. далее сценарий и выводы оставляю почти земляку.
          Ответить
          • если ты юзаешь сторонние либы для сортировок в проекте на миллиард баксов - протестируй.
            включая border/invalid cases.
            случай с огромным массивом и переполнением - классический border case.
            Ответить
            • вот только не надо перекладывать ответственность, библиотеку должны тестить разработчики библиотеки, а не ее пользователи
              Ответить
              • А пользователя никто не заставляет использовать хз как написанныю и не/протестированную либу, не вникнув в её суть)
                Ответить
        • > да нахуй такие большие массивы
          Индекс какой-нибудь ниофорджа или бигдаты
          Ответить
          • сразу вспоминается фейл Твиттера
            Ответить
            • Не, не самого Твиттера. Сфейлились авторы сторонних клиентов, которые думали, что инта будет достаточно :)
              Ответить
              • они же сначала на интерпретируемом Руби писали, а потом пришлось переписать
                Ответить
                • > а потом пришлось переписать
                  На интерпретируемый PHP? :)
                  Ответить
                  • на скомпилированный PHP, вы-то в курсе, но общественность не заблуждайте
                    Ответить
                • Руби разве не умеет автоматически в большие числа?
                  Ответить
                  • нет, Руби не для больших нагрузок
                    Ответить
                  • в целые умеет. а флоат у него ограничен - пишет inf если слишком много
                    Ответить
    • Да, хуйню запостил. Минусуйте.

      Кто нибудь знает как определить, что функция находится в потоке, и идентифицировать этот поток относительно быстрыми методами?
      Ответить
      • > функция находится в потоке
        Что значит в потоке? Любая функция исполняется в каком-нибудь потоке, даже main() :)

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

        P.S. В общем виде ответ звучит так: "Есть некая функция, которая возвращает id потока. Запиши где-нибудь в main'е id главного потока и сравнивай айди текущего с ним."
        Ответить
        • язык c++. Как вообще этот id определить. Неважно в каком виде он будет. Главное чтобы отличить один поток от другого.
          Ответить
      • показать все, что скрытоkeep your chin up !

        :D
        Ответить
      • кинуть ексепшен, сразу его поймать и посмотреть стектрейс
        Ответить
        • У него там были плюсы. Эксепшон не поможет получить стектрейс.
          Ответить
          • а
            ну тогда упасть с эксепшеном чтобы операционка записала дамп, а потом настроить её так чтобы она заново запустила твою программу в случае падения и при запуске считать дамп, открыть его дебагфункциями и найти там стек
            Ответить
            • > и при запуске считать дамп, открыть его дебагфункциями и найти там стек
              Но Pid при этом сменится.
              Ответить
              • вот чорт

                тогда нужно в кажом потоке вызывать специальную функцию, например Potok1() чтобы найти её в стеке и понять что это твой поток. Таких функций советую сделать много чтобы хватило на все потоки.


                кстати, в линуксе же нету JIT debugging для postmorten (Как AeDebug в венде).
                Выходит надо сразу под gdb запускать
                Ответить
        • а еще можно положить рендомные числа в тредлокалсторадж!

          но вариант крешем и перезапуском мне нравится
          я даже знаю как скрипт для дебагера написать чтобы он перезапускал
          Ответить
    • vanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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