【发布时间】:2014-09-20 17:50:18
【问题描述】:
我想保留一个排序的项目队列,我希望能够弹出具有最低值的项目(有点像std::priority_queue)。项目值是连续的并且不断增加。但是,这些项目没有定义小于比较,它们只有is-previous 和is-next 谓词(其中A is-previous B == B is-next A),它们还支持++ 或--。
我想知道是否有任何算法可以(部分)基于这些谓词对值进行排序?或者,是否有更好的方法来跟踪这样的队列?
在模算术中工作时会出现此问题 - 项目由整数指定,但由于模,小于和大于失去了意义,并且不能再用于排序。
选择的语言是 C++,但我想我可以移植大多数合理的语言。
编辑
向所有试图回答的人致以歉意,在编写示例代码时,我意识到原始问题的格式不正确。这真的很尴尬,但我想强调的是,你的时间并没有浪费,因为我为此流汗了一个小时,然后在 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 我想对它们进行排序,因为保持排序后的数组通常比未排序的数组快得多。无论如何我都无法使用
std::priority_queue,因为它需要一个小于谓词。我会使用std::vector来存储值,您可以轻松地在那里vector.insert(where, 1, what)。 -
包装双端队列,并禁止除 start 和 end 之外的任何插入。
-
@Basilevs 这没什么用。如果具有最低值的项目最终在中间怎么办?我永远也达不到。
-
如果您正在编写一个库来维护合同的一端,请告诉我们合同。否则,请告诉我们实际问题的具体实例,不要过早地尝试概括,因为阅读您实际上并不关心的破碎形式是浪费时间。
标签: c++ algorithm sorting data-structures