我试图用自定义比较器实现带有Priorityqueue的MST,但是我在O(n)时间内用它构建min-heap时遇到了问题.问题是,Priorityqueue的一个构造函数只允许在O(n)中创建PriorityQueue,但它不会将任何比较器作为参数.我希望它使用我的自定义比较器.这个问题有解决方法吗?PriorityQueue.addAll()将失去使用Min-heap作为MST的目的,因为它是O(nlogn)方法.这是我的代码.
ArrayList <edge>ar=new ArrayList<>();
for(int i=0;i<e;i++)
{
int u=ss.nextInt();
int v=ss.nextInt();
int w=ss.nextInt();
ar.add(new edge(u,v,w));
}
PriorityQueue <edge>pr=new PriorityQueue<edge>(ar);
Run Code Online (Sandbox Code Playgroud)
我要使用的比较器: -
PriorityQueue <edge>ar=new PriorityQueue(11,new Comparator() {
@Override
public int compare(Object o1, Object o2) {
edge n1=(edge) o1;
edge n2=(edge) o2;
if(n1.w<n2.w)
{
return -1;
}
else if(n1.w==n2.w)
{
if((n1.u+n1.v+n1.w)<=(n2.u+n2.v+n2.w))
{
return -1;
}
else
{
return 1;
}
}
else
{
return 1;
}
}
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试捕获在任何android应用程序中进行的所有方法调用。为此,我正在使用JDI为该应用程序的每个运行线程注册MethodEntryRequest。我可以成功完成此操作,但是我遇到的问题是该应用程序变得非常非常慢。所以我想知道我在实现中是否做错了什么。我将代码添加到我首先注册ClassPreparedRequest的地方,以捕获应用程序进程对每个类的加载,并在其中将MethodEntryRequest与threadfilter注册到导致该类加载的线程。
if(!traceMap.keySet().contains(event.thread()))
{
EventRequestManager mgr = vm.eventRequestManager();
MethodEntryRequest menr = mgr.createMethodEntryRequest();
menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
menr.addThreadFilter(event.thread());
menr.enable();
}
Run Code Online (Sandbox Code Playgroud)
用于注册ClassPreparedRequest的代码为
ClassPrepareRequest cpr = mgr.createClassPrepareRequest();
cpr.addClassFilter("com.example.*");
cpr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
cpr.enable();
Run Code Online (Sandbox Code Playgroud) 为了解决动态编程问题,我使用了两种方法来存储表条目,一种使用多维数组 ex:tb[m][n][p][q] ,另一种使用哈希图并使用第一种方法的索引来使用字符串作为“m,n,p,q”中的键。但对于一个输入,第一种方法会在 2 分钟内完成,而其他方法则需要 3 分钟以上。如果哈希图和数组的访问时间渐近相等,为什么性能差异如此之大?