1. C# / Говнокод #14123

    +130

    1. 1
    List<KeyValuePair<string, string>> documentList = GetList();

    использование списка пар ключ-значение вместо словаря (Dictionary<string, string>)

    Запостил: mozg_raka, 22 Ноября 2013

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

    • показать все, что скрыто
      public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
      	ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, 
      	IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, 
      	IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable, 
      	IDeserializationCallback

      зачем мне тянуть всю эту бадью, если передавать мне нужно просто список пар?
      Ответить
    • Когда размер словаря небольшой, список пар выгоднее по памяти и производительности.
      Ответить
      • По производительности поиска? Бенч можно? В питоне уже на 2х элементах разница была в 2 раза.
        Ответить
        • ты выбрал отличный язык для бенчей и сравниваешь интерпретируемую реализацию списка пар с нативной детально оптимизированной реализацией словаря.
          Ответить
          • Там был поиск в списке против поиска в множестве, оба нативные.
            Ответить
            • УВР
              http://ideone.com/439t9M
              Ответить
              • Пардон, но разница настолько минимальна, что можно пердолить мэп и не задумываться. Если ты конечно не брутефорсеры пишешь.
                Ответить
                • Разница не велика (всего в полтора раза), но и использование списка пар вместо хэша для малого числа элементов говном особо не назовёшь.
                  В общем случае можно начинать сразу с хэш-таблички и не думать.

                  Если готовой реализации ни того ни другого нет, а размеры маленькие, я бы начал со списка пар.
                  Ответить
              • Тайпдефы уже не в моде?
                Ответить
      • Жаль лишь, что в языках нельзя это прозрачно использовать. Например, в той же Java нет какого-нибудь NaiveArrayMap
        Ответить
        • Кстати, сегодня случайно заметил, что в андроиде такая штука как раз есть - http://developer.android.com/reference/android/util/ArrayMap.html. Она не совсем наивная, там используется бинарный поиск, но тем не мене.
          Ответить
    • показать все, что скрытоА что если мне важен порядок этих пар значений и наличие дубликатов?
      Ответить
      • Не понял.
        Ответить
        • показать все, что скрыто— раздался пронзительный голос со стороны параши.

          Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

          Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
          Ответить
    • в случае, если код писался под .net2.0, где небыло кортежей - вполне обоснованый способ хранить пары "ключ-значение", при условии, что
      1) могут быть повторяющиеся ключи
      2) мне важен порядок этих пар
      3) 1 и 2 вместе
      Ответить
      • А класс сложности неважен?
        Ответить
        • Сохранение порядка, если его требует условие задачи, всегда важнее класса сложности. В конце-концов сложность влияет лишь на время вычислений, а порядок - на их корректность. Тебе нужен быстрый, но не отвечающий условию задачи ответ? Мне - нет :)

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

          И всегда нужно понимать, что у контейнеров нет класса сложности. Он есть только у операций над ним.
          Ответить
          • Трололо? Есть же алгоритмы с сохранением порядка и сублинеарной сложностью операций.

            Давай не будем к словам цепляться? Можно догадаться, что речь о сложности поиска и удаления.
            Ответить
            • > Есть же алгоритмы с сохранением порядка и сублинеарной сложностью операций.
              Да я разве спорю, самая тупая версия - комбо из хешмапа и списка (жабий LinkedHashMap). Вставляет, удаляет за амортизированное O(1). Ищет за O(1). Обходит шустро и в правильном порядке. В пыхе вон его вообще по дефолту сунули, чтобы народ радовался скорости и правильному порядку :)

              > Можно догадаться, что речь о сложности поиска и удаления.
              А можно догадаться, что речь о сложности вставки в конец (открыли новый документ), удаления (закрыли документ) и полного скана (список рисуется в окне, на несколько порядков чаще, чем документы открываются и закрываются). О точном применении этой структуры знает только автор. То что он юзает KeyValuePair еще совсем не означает, что эта хуйня юзается как словарь. По мне так автору просто было влом описывать отдельный класс с двумя полями. Давай не будем гадать?

              Где-то лучше хешмап. Где-то лучше банальный список. Все зависит от операций и их частоты.
              Ответить
              • >удаления (закрыли документ)
                Для удаления надо сначала найти.

                >Давай не будем гадать?
                Давай. В общем случае linkedhashmap будет горазно лучше.
                Ответить
                • > В общем случае linkedhashmap будет горазно лучше.
                  Ну если на память пофиг - согласен.
                  Ответить
                  • Для маленького количества - пофиг, для большого - класс сложности важнее.

                    Чем меньше известно об условиях, тем более общий нужен алгоритм. А то будет как сортировка в myisam.
                    Ответить
            • > сублинеарной сложностью операций
              > сублинеарной
              Что это?
              Ответить

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