Создание структуры данных (слияние связанных списков PQ?)

Итак, мне нужно найти структуру данных для этой ситуации, которую я опишу: Это не моя проблема, но поясняю аспект структуры данных, который мне нужен более кратко: у меня есть армия, состоящая из взводов. В каждом взводе есть определенное количество человек и номер звания (чем выше, тем лучше). Если бы враг напал на мою армию, он убил бы некоторую МОЩНОСТЬ моей армии, начиная с самого слабого взвода и увеличивая количество силы (ранг взвода), чтобы убить каждого солдата из взвода.

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

Примечание: Java PriorityQueue.Iterator() печатает элементы в случайном порядке, я знаю, что итератор - это все, что мне нужно, просто к вашему сведению.

Проблема в том, что если бы я реализовал это как pq, я мог бы видеть только верхний элемент, поэтому мне пришлось бы выталкивать взводы, как если бы они умирали, а затем возвращать их обратно, когда мысль об атаке была рассчитана. Я также мог бы реализовать это как связанный список или массив, но вставка занимает слишком много времени. В конечном счете, я хотел бы использовать приоритетную очередь. Мне просто нужна возможность просматривать либо (выбрать индекс) элемент из pq, либо чтобы каждый объект в pq имел указатель на следующий объект в pq, например связанный список.

Возможна ли эта мысль о поддержке указателей с помощью pq, например связанного списка, в PriorityQueue Java? Это реализовано для меня где-то в PriorityQueue, о котором я не знаю? индекс реализован? есть ли другая структура данных, которую я могу использовать, которая лучше подходит для моей цели? Реально ли мне найти исходный код из Java PriorityQueue и переписать его на моей машине, чтобы поддерживать эти указатели в виде связанного списка? Любые идеи очень приветствуются, не совсем уверен, какой путь я хочу выбрать.


person user636224    schedule 27.02.2011    source источник


Ответы (1)


Вы можете создать расширенное двоичное дерево поиска. Это позволило бы эффективно обращаться к n-му наименьшему элементу, сохраняя при этом порядок элементов. Вы также можете использовать бинарное дерево поиска с нитями. Это позволит вам переходить от одного элемента к следующему, более крупному, за постоянное время, что быстрее, чем в обычном двоичном дереве. Однако обе эти структуры данных медленнее, чем куча.

person Jeremiah Willcock    schedule 27.02.2011