在MatLab中使用Java PriorityQueue

djp7away  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(234)

我在MatLab中需要一个最小堆,并且我正在尝试使用Java的PriorityQueue。我被困在如何供应比较器的问题上。到目前为止,我已经初始化了PriorityQueue,并且可以向其添加一个值索引对:

>> q = java.util.PriorityQueue
q =
[]
>> q.add({1,3})
ans =
     1

当我尝试添加更多数据时出现问题:

>> q.add({2,4})
??? Java exception occurred: 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.Comparable
    at java.util.PriorityQueue.siftUpComparable(Unknown Source)
    at java.util.PriorityQueue.siftUp(Unknown Source)
    at java.util.PriorityQueue.offer(Unknown Source)
    at java.util.PriorityQueue.add(Unknown Source)

this post中,我看到我需要提供一个比较器函数,但我不知道如何做到这一点。

k2arahey

k2arahey1#

优先级队列需要包含实现可比较的对象,或者需要在构造时传入比较器函数。
目前在MatLab中没有一种方法既不能用MatLab代码实现Java接口,也不能提供文字上的Java代码。
因此,您必须遵循@nibot的建议,创建一个包含实现比较器的类的小.jar文件。

1tu0hz3e

1tu0hz3e2#

假设您可以使用非负浮点值和整数索引,以下是部分答案。我们的想法是将这对对象串在一起,并将其用作Java队列中的可比对象。

q = java.util.PriorityQueue;
q.add(encode(1.2,4));
q.add(encode(1.1,8));
q.add(encode(8.0,1));
q.add(encode(1e-7,0));

% Pop and print
while ~q.isEmpty()
  [value,index] = decode(q.remove());
  fprintf('%g,%d\n',value,index)
end

function u = encode(value,index)
  % value should be non-negative
  % index should be an integer
  u = sprintf('%010d,%d',uint64(java.lang.Float.floatToIntBits(value)),index);
end
function [value,index] = decode(u)
  value_index = sscanf(u,'%d,%d',2);
  value = java.lang.Float.intBitsToFloat(value_index(1));
  index = value_index(2);
end

在一个快速而肮脏的测试中,推入并弹出10000个随机浮点数需要0.5秒,而推入然后弹出10000个(随机浮点数,索引)对需要0.75秒。头顶上有,但也许不是凶手。

c6ubokkw

c6ubokkw3#

import java.util.*;

q = java.util.PriorityQueue();
for i=1:10
q.add(i);
end
disp(q)
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

相关问题