我想保留一个排序的项目队列,我希望能够弹出具有最低值的项目(有点像std::priority_queue
)。项目值是连续的并且不断增加。但是,这些项目没有定义少于比较的对象,它们只有is-previous
和is-next
谓词(其中A is-previous B
== B is-next A
),它们也支持++
或--
。保留已排序的序列而没有小于谓词
我不知道是否有任何算法(部分)根据这些谓词排序值?或者,有没有更好的方法来跟踪这样的队列?
在模运算中工作时出现此问题 - 项由整数指定,但由于模,小于和大于,失去其含义,不能用于排序了。
选择的语言是C++,但我想我可以移植大部分合理的语言。
编辑
Appologies所有的人试图回答,一边写代码示例,我意识到是病态的原题。这真是令人尴尬,但我想强调,你的时间并没有浪费,因为我汗流one背了一个小时,然后在10分钟内我意识到这是错误的。无论如何,这是行为我想:
template <class T>
class OrderedQueue {
std::vector<T> storage;
T next;
public:
OrderedQueue(T lowest_value = T())
:next(lowest_value)
{}
void Push(T t)
{
storage.push_back(t);
}
T Pop()
{
std::vector<T>::iterator it = std::find(storage.begin(), storage.end(), next);
if(it == storage.end())
throw std::runtime_error("no such element");
T value = *it;
storage.erase(it);
++ next;
return value;
}
};
我的问题是Pop()
需要O(N)
。有没有办法让它更快,使用is-prev和is-next谓词?
为什么你需要对它们进行排序?你不能在中间添加任何东西! – Basilevs 2014-09-20 17:54:46
@Basilevs我想对它们进行排序,因为保持排序的数组通常比未排序的数组快。无论如何,我无法使用'std :: priority_queue',因为它需要一个比谓词少的谓词。我会使用'std :: vector'来存储这些值,并且在那里你可以很容易'vector.insert(where,1,what)'。 – 2014-09-20 18:03:32
换行,并禁止除开始和结束之外的任何插入操作。 – Basilevs 2014-09-20 18:04:28