двух связный кольцевой список(сортировка)

Тема в разделе "WASM.A&O", создана пользователем XshStasX, 6 янв 2012.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В общем есть двух связный кольцевой список некой структуры(размером до 60 байт).
    Какой бы лучше выбрать алгоритм сортировки ? интересует в первую очередь скорость.

    Информация о списке:
    Список может быть частично на 10 - 30% отсортирован.
    Количество элементов теоретически безгранично, а практически 500 - 5000 .

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

    Сортировка нужна для более быстрого поиска элемента в списке.
    Буду хранить 3 элемента (начало, средину, и последний используемый элемент ) и от них уже делать линейный поиск.

    Есть лучше вариант для сортировки\поиска в списке?
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Не граф ли это ?
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Быстрая сортировка как раз для такого и придумывалась.

    А мне нравится.

    Зависит от задачи. Но часто можно свести к O(1) для 50-99%, вычисляя угадывая наиболее вероятный результат для следующего поискового запроса.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Pavia
    Думал есть способ лучше.

    Malfoy
    Именно он.
     
  5. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Тогда зависит от того, что он описывает. Если для бинарного кода и должен модифицироваться для дальнейшей компиляции, то только трассировка. Иначе можно просто все элементы перебрать подряд.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Malfoy
    Да бинарного кода.
    Есть отдельное поле которое все элементы связывает, нужно для освобождения ресурсов.
    Если в конце изменить связи по этому полю граф не нарушиться, а вот к примеру поиск блока по адресу ускорится.

    Что ты имеешь ввиду под трассировкой?
    Вызов CallBack функции для каждого узла/элемента ?
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    XshStasX
    Граф может быть массивом, а может им не являться. Массив это последовательность описателей, которые находятся друг за другом в определённой области памяти. Тогда следующий описатель J' = @J + sizeof(J). Если граф будет изменяться, например добавляться часть другого графа, то он уже не может быть массивом. Память между двумя элементами двух графов не принадлежит ни однуму из них. К примеру морфите вы вы блок в определённой процедуре - придётся смещать весь граф, править все ссылки, короче это полный бред. Вот для такого графа описатели перечисляются только раскрытием ссылок(напр J' = J.Flink). При этом не важно где в памяти находится описатель. Такое перечисление называется трассировкой.
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Не совсем понял тебя.
    Описатели ты имеешь ввиду структуры блоков\переходов\тп ?

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

    То нужно
    1. Перечислить все линейные блоки внутрь которых нету переходов из других блоков. Переходы могут быть только на первую инстр. блока. И поправить смещения.
    2. поправить смещения всех переходов которые ссылаются на смещенные блоки. Смещенные блоки можно получить из п.1 введя флаг поправки блока или отдельный список .

    вроде ничего не опустил ?
     
  9. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Может лучше поглядеть в сторону хэш-таблиц? Эдакая комбинация хэш-таблиц и списков - вместо одного списка - целый массив списков (скажем несколько тысяч), растущих из слотов, соответствующих хэшам от ключевых значений?
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    XshStasX
    Зачем чтото пересчитывать, если можно этого не делать.. Вы в любом случае будите при вставках в граф(при его создании) добавлять новые элементы(описатели) в конец графа. Это сделает граф не линейным - описатели подряд идущих в памяти блоков будут находится в разных местах в графе. Чтобы привести его в годный вид, придётся конвертировать граф в линейный, посредством трассировки. В противном случае например последовательно не получится енумить описатели. Таким образом оказывается что линейный граф очень не удобный. Манипуляции должны выполняться с не линейным графом.

    Dmitry_Milk
    Вместо одного списка - целый массив костылей :lol:
     
  11. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Можно и один (список), но с массивом "костылей", указывающих, где в списке начинаются/заканчиваются соответствующие слотам участки. Хочешь - пользуйся списком как обычно (только не забывай и костыли подправлять при вставке-удалении), а надо быстро найти - ползуйся указателями слотов по хешу.