在Matlab中存储字典的最有效方法

在Matlab中存储字典的最有效方法,matlab,hashmap,Matlab,Hashmap,我有一组与成本相关的ID,它只是一个双倍值。ID是整数且唯一。两个ID可能具有相同的成本。我将它们存储为:- a=containers.Map('KeyType','uint32','ValueType','double'); a(1)=7.3 a(2)=8.4 a(3)=7.3 现在我想找到最低成本 b=[]; c=values(a); b=[b,c{:}]; cost_min=min(b); 现在我想找到所有相关ID,即1和3,成本最低,即7.3。我可以将所有密钥收集到一个数组中,然后在

我有一组与成本相关的ID,它只是一个双倍值。ID是整数且唯一。两个ID可能具有相同的成本。我将它们存储为:-

a=containers.Map('KeyType','uint32','ValueType','double');
a(1)=7.3
a(2)=8.4
a(3)=7.3
现在我想找到最低成本

b=[];
c=values(a);
b=[b,c{:}];
cost_min=min(b);

现在我想找到所有相关ID,即1和3,成本最低,即7.3。我可以将所有密钥收集到一个数组中,然后在此数组上执行for循环。有没有更好的方法在Matlab中完成这整个过程,从而不需要for循环?

稀疏矩阵可以用作哈希映射,只需执行以下操作:

a= sparse(1:3,1,[7.3 8.4 7.3])
find(a == min(nonzeros(a))

稀疏矩阵可以用作哈希映射,只需执行以下操作:

a= sparse(1:3,1,[7.3 8.4 7.3])
find(a == min(nonzeros(a))

有一些方法可以在地图上用于此类操作

寻找最小值和最小键的方法可以这样做

a=containers.Map('KeyType','uint32','ValueType','double');
a(1)=7.3;
a(3)=8.4;
a(4)=7.3;

minval = inf;
minkeys = -1;
for k = keys(a)
    val = a.values(k);
    val = val{1};
    if (val < minval(1))
        minkeys = k;
        minval = val;
    elseif (val == minval(1))
        minkeys = [minkeys,k];
    end
end

disp(minval);
disp(minkeys);

还有一篇文章举例说明了如何将稀疏矩阵用作hashmap。让索引成为关键。这将占用普通数组中所有非零元素大约3倍的内存,但映射使用的内存也比数组多。

有一些方法可以在映射上用于此类操作

寻找最小值和最小键的方法可以这样做

a=containers.Map('KeyType','uint32','ValueType','double');
a(1)=7.3;
a(3)=8.4;
a(4)=7.3;

minval = inf;
minkeys = -1;
for k = keys(a)
    val = a.values(k);
    val = val{1};
    if (val < minval(1))
        minkeys = k;
        minval = val;
    elseif (val == minval(1))
        minkeys = [minkeys,k];
    end
end

disp(minval);
disp(minkeys);

还有一篇文章举例说明了如何将稀疏矩阵用作hashmap。让索引成为关键。这将占用普通数组中所有非零元素大约3倍的内存,但映射使用的内存也比数组多。

那么键和值基本上都是数字?将密钥的数据类型也更改为double会有伤害吗?我不这么认为,那么你可以把所有的东西都放在一个普通的数组中。@Wewalk我在别处读到,matlab中的映射容器做O(1)搜索,而不是遍历数组。我主要关心的是速度。如果你能建议一种在普通数组上执行此操作的快速方法,那对我来说就足够了。@user_1_1_1我想你误解了贴图的概念。如果您有一个与值关联的键,并且希望获取特定键的值,则映射是有效的。这种搜索可以很快,因为密钥是以一种高效的方式存储在内部的(例如,使用一些散列排序或映射)。然而,你的问题是相反的。您希望找到最小的值。与ID不同,这些ID没有排序。这意味着要找到最小的值,您平均仍有O(n/2),但元素访问速度会较慢。所以,若你们需要很多键查找,那个么使用map,否则2数组可能会做得更好。所以基本上键和值都是数字?将密钥的数据类型也更改为double会有伤害吗?我不这么认为,那么你可以把所有的东西都放在一个普通的数组中。@Wewalk我在别处读到,matlab中的映射容器做O(1)搜索,而不是遍历数组。我主要关心的是速度。如果你能建议一种在普通数组上执行此操作的快速方法,那对我来说就足够了。@user_1_1_1我想你误解了贴图的概念。如果您有一个与值关联的键,并且希望获取特定键的值,则映射是有效的。这种搜索可以很快,因为密钥是以一种高效的方式存储在内部的(例如,使用一些散列排序或映射)。然而,你的问题是相反的。您希望找到最小的值。与ID不同,这些ID没有排序。这意味着要找到最小的值,您平均仍有O(n/2),但元素访问速度会较慢。所以,如果您需要许多键查找,请使用map,否则2数组可能会做得更好。这是假设ID是单调递增的。ID很可能是不连续的,例如[1,3,7]。那么这就行不通了。而是尝试
a=sparse([1,3,7],1[7.3 8.4 7.3]);发现(a==min(a(a>0))。这是假设ID单调增加1。ID很可能是不连续的,例如[1,3,7]。那么这就行不通了。而是尝试
a=sparse([1,3,7],1[7.3 8.4 7.3]);发现(a==min(a(a>0))