Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最后一个索引的Java映射与数组(临时)排序_Java_Arrays_Sorting_Map_Hashmap - Fatal编程技术网

最后一个索引的Java映射与数组(临时)排序

最后一个索引的Java映射与数组(临时)排序,java,arrays,sorting,map,hashmap,Java,Arrays,Sorting,Map,Hashmap,我研究过类似的问题,这些问题详细说明了映射的排序和基本数据类型数组的排序,但没有任何问题直接详细说明了Java映射的一次性排序与基本数据类型数组([])之间的区别 Primary note*我知道“TreeMap”是Java中Map的排序版本(按键),但我不知道TreeMap如何对键进行排序的“幕后”有多少(无论是在添加数据时,还是在添加完数据后) Primary note 2*Dijkstra的算法在这种情况下不是一个精确的实现。我们只是在一个M节点的图G中寻找加权边的最短路径。这意味着邻接矩

我研究过类似的问题,这些问题详细说明了映射的排序和基本数据类型数组的排序,但没有任何问题直接详细说明了Java映射的一次性排序与基本数据类型数组([])之间的区别

Primary note*
我知道“TreeMap”是Java中Map的排序版本(按键),但我不知道TreeMap如何对键进行排序的“幕后”有多少(无论是在添加数据时,还是在添加完数据后)

Primary note 2*
Dijkstra的算法
在这种情况下
不是一个精确的实现。我们只是在一个M节点的图G中寻找加权边的最短路径。这意味着邻接矩阵(如下所示格式)的大小为M x M。这是
而不是
智能实现。基本上就像你能得到的底线一样。。。抱歉搞混了


我们得到了一个邻接矩阵,在下面的示例中,元素相互关联(“连接”):

0,1,5   // 0 is connected to 1, and the weight of the edge is 5
0,2,7   // 0 is connected to 2, and the weight of the edge is 7
0,3,8   // 0 is connected to 3, and the weight of the edge is 8
1,2,10  // 1 is connected to 2, and the weight of the edge is 10
1,3,7   // 1 is connected to 3, and the weight of the edge is 7
2,3,3   // 2 is connected to 3, and the weight of the edge is 3

但不管输入是什么,只要假设我们有一个值矩阵可以操作就行了

我们正在考虑将所有可能的路径存储在一个“最短路径”算法中(我确信在SO上75%或更多的人知道Dijkstra的算法)。这是家庭作业,但是一个实施问题,而不是“为我解决这个”问题

假设
矩阵的大小非常大
(大小M x M),可能大于
50x50
。这将导致
[50-1]/2=1.52×10^64
在结果列表中显示结果,假设我们的算法足够聪明,能够挑出重复的路径,并且没有找到重复路径的长度(事实并非如此,因为我们是图论和Java的高手,所以请不要建议任何避免重复的算法…)


我的朋友说,对列表中int[n]的索引进行临时排序(使用临时变量),其中int[n]是
最后一个索引
,最短路径的
(算法1)可能比树映射(算法2)快,树映射的
是最短路径的

我们正在讨论什么样的实现可以更快地找到最短路径的所有
长度。我们可以将其存储为每个路径的最后一个索引(具有int[],其中最后一个元素是最短路径(数组中的所有元素)的值(总和)(算法_1),也可以将该总和存储为映射的键(算法_2)

因为这是一个
最短路径算法
(虽然不是一个很好的算法…),我们需要按长度对每条路径的结果进行排序,这是图中每条边的总和,以便找到最短路径


因此,真正的问题是:通过Map.sort()算法(内置于Java标准库中)或通过创建一个临时变量来保存每个int[]中最新“length”的值,在只对结果进行一次排序时,什么方法更快呢

myMap.sort(); // Unless TreeMap in Java does 'behind=the-scenes' sorting on keys...
myMap.get(0); // This would return the first element of the map, which is the shortest path

int temp=myList.get(0)[m];//存储一个作为“最短路径”的临时变量
for(myList中的int[]i){
如果(temp>myList.get(i)[m]){//检查当前路径是否比前一个路径短
temp=myList.get(i)[m];//如果当前路径较短,则替换temp
}
}

注意
我还没有实际测试实现,也没有检查我自己的Java语法,所以我不知道这些语句是否正确声明。这只是一个理论问题。哪一个运行得更快?这是我学习Java的第三年,我不知道HashMap中使用的底层数据结构,也不知道Big O notat任何一种实现都是无效的

也许了解Java标准的人可以描述HashMap vs(Primitive data type)[]中使用的是什么样的数据结构或实现,以及
一次性
结构中的运行时差异

我希望这项调查是有意义的,我感谢所有花时间回答我问题的人;我总是感谢像你们这样慷慨的人花时间和精力帮助教育新手

问候,,
Chris

为了找到最短路径,可能不需要对数据进行排序。相反,您可以遍历数据并跟踪遇到的最短路径

假设数据存储在数据对象数组中,data.pathLength表示路径长度

Data[] data; // array of data
Data shortest = data[0]; // initialize shortest variable
for(int i = 1; i < data.length; i++) {
    if(data[i].pathLength < shortest.pathLength)
        shortest = data[i];
}
Data[]Data;//数据数组
数据最短=数据[0];//初始化最短变量
对于(int i=1;i
也就是说,TreeMap是一种平衡二叉树。与标准二叉树不同,平衡二叉树将旋转其分支以确保其近似平衡,从而确保log(n)查找和插入。红黑树确保最长分支的长度不超过最短分支长度的两倍;an是具有更严格限制的平衡二叉树。长话短说,树映射将以n*log(n)时间对其数据进行排序(每次插入的日志(n)乘以n个数据点)。如果您使用的是Mergesort、Quicksort或Heapsort等(与Bubblesort或其他n^2排序算法相反),则一次性数组排序也将在n*log(n)时间内对其数据进行排序。顺便说一句,您可以使用这样的转换排序,它的oh值很大,为O(n),但转换排序通常占用大量内存,并且表现出糟糕的缓存行为,因此使用n*log(n)比较排序通常会更好

由于TreeMap和您的自定义排序都是n*log(n),这意味着两者在理论上都没有多大优势,所以只需使用更易于实现的一种
Data[] data; // array of data
Data shortest = data[0]; // initialize shortest variable
for(int i = 1; i < data.length; i++) {
    if(data[i].pathLength < shortest.pathLength)
        shortest = data[i];
}
 how much about the 'behind-the-scenes' of how TreeMap sorts the keys (either while data   
 is being added, or after the data is FINISHED being added)?