几周后我有期末考试,我们的练习题是这样的:
给定一个N个整数的队列,在队列中找到最小值并将其从队列中删除。当您完成时,其余的值必须按照它们原来的顺序。您只能使用队列操作,也就是说,您无权访问数组或链表中的基础存储。描述实现此操作的最省时的方法,并给出以N表示的顺序(大O)。
编辑:队列操作是“enqueue”、“dequeue”、“isfull”、“isempty”,如果是循环队列,则是“front”和“back”。
如果您有一个队列,并且只允许在其上执行入列和出列操作,那么在队列中查找任意值的唯一方法是执行查找特定值所需的许多出列操作。如果您不知道该值在队列中的位置,那么在最坏的情况下,您可能必须检查队列中的所有n个元素,这需要花费θ(n)个时间。所以从这个意义上说,在最坏的情况下,我们想出的任何解决方案都必须至少做θ(n)功。
这样做的一种方法是,假设队列是一个元素环,在某个位置有一个光标指示前面。如果您出列一个元素,然后立即重新排队,就好像您将光标顺时针(或逆时针--这毕竟只是一个比喻)移动了一个点。因此,可以考虑通过在队列中移动光标来解决这个问题,直到找到要删除的元素,然后在不重新排队的情况下将其出列,然后将光标移动到开始的位置。这里有一种方法:
/* Store the number of elements in the queue, since it will change as
* the loop runs. We want to visit each element exactly once.
*/
int numElems = queue.size();
for (int i = 0; i < numElems; i++) {
ValueType elem = queue.dequeueMin();
/* Remove the element if it matches the thing to get rid of, or,
* equivalently, preserve the element if it isn't.
*/
if (elem != theThingToRemove) {
queue.enqueue(elem);
}
}
这个算法总是做θ(n)个工作--循环对每个元素访问一次,并对每个元素做O(1)个总工作和O(1)个队列操作。
有趣的事实:队列的这个比喻正是循环缓冲区背后的思想,循环缓冲区通常用于实现固定大小的队列。
到目前为止,这就是我的答案,但从逻辑上讲,我的答案对于findNextCity方法似乎是错误的。此外,我甚至不知道如何处理问题的第二部分(以下)。 我应该遍历cityQueue中的每个元素,使用下一种方法计算的欧几里德距离(distbetweencies),确定哪个元素最接近当前城市(从第一个参数)。我必须忽略已经标记在堆栈中或堆栈中的城市以及当前城市本身(否则,城市将始终是离自身最近的城市!)。
我最近将一台服务器从ActiveMQ从5.8升级到了最新版本(5.11.1)。从那以后,我偶尔注意到,消息将在特定队列中累积,而不会被删除。 我们的架构有一个生产者,一个消费者。我可以看到消费者仍然保持联系,但制作人的信息越来越多。我的解决方案是通过web控制台删除队列。之后,我立即看到消费者重新连接,消息再次开始处理。 如果相关,在这种情况下,生产者正在运行NMS。NET和消费者在Java 1.
我试图找到矩阵中每列的最小值和最大值,但我当前的代码运行不正确。我试图把最小值放在一个新矩阵的第一行,最大值放在下一行,并对每一列这样做。任何帮助都将不胜感激,谢谢!
我有一个如下所示的数据表 它有代表名称的p列和代表值的t列。t1是对应于p1、t2到p2等的值... 在每一行上,p列的值都是唯一的(或)。t列中的值也是如此。 我要做的是创建三个新列: ,每行所有t列的最小值(不包括NA) ,如果t_min存在(不是NA),则p列的对应值…因此,如果t2列具有t-min值,则列的对应值 ,具有p_min值的列的名称。因此,如果p_min值来自column,则“p
问题内容: 如何在0(1)时间复杂度的任何时间从队列中检索max和min元素?早些时候,我使用Collections.max和min查找元素,但这将是0(n)。 问题答案: 您只有2种方法来获得最小/最大操作的O(1): 如果结构已排序,并且您知道最大值/最小值位于何处 如果结构未排序且仅允许插入:每次插入项目并分别存储值时,您可以重新计算最小值/最大值 如果结构未排序并且允许插入和删除:我认为您
假设我有一个包含元素的列表。 使用Java8 streams,如何找到列表最小元素的索引(例如,在本例中为1)?