我有一个数组(nodes[][]
),其中包含有效距离的值,如下所示:
__ __
|1 0.4 3 |
|0.4 1 0 |
|3 3.2 1 ... |
|0.8 4 5 |
|0 0 1 |
-- --
第一个值node[0][0]
是节点0到节点0的距离,即1
因此从节点2到节点1的距离是3.2(node[2][1]=3.2
)
给定一个节点列,我需要搜索行以找到最远的距离,而不是自行选择(node[1][1]
)
我想的方法是做这样的事情:
int n=0;
currentnode=0; //this is the column I am searching now
if(currentnode==n)
n++;
best=node[n][currentnode];
nextbest=node[n++][currentnode];
if(nextbest>best)
best=nextbest;
else
for(int x=n;x<max;x++) //max is the last column
{
if(currentnode==n)
continue;
nextbest=node[x][currentnode];
if(nextbest>best)
best=nextbest;
}
我想不出更好的方法来做到这一点。我可以使用函数来缩短它,但这通常是我正在考虑使用的。在此之后我必须循环这个以转到最佳距离返回的下一列并再次执行此例程。
答案 0 :(得分:2)
在尝试优化时,您必须做出选择:
您想要在插入期间或搜索期间获得费用吗?
如果您在容器中插入很少,并且需要进行大量搜索,那么您需要一个已排序的容器。找到最大值将是O(1) - 即只选择最后一个元素。
如果您有大量插入和一些搜索,那么您可以使用未排序的容器,并且找到最大值为O(n) - 即您必须至少检查一次所有值以选择最大值。
答案 1 :(得分:0)
你可以简化它。很多检查和临时变量都是多余的。这是一个执行搜索的小功能。我已将大多数变量重命名为更准确的角色。
int maxDistance(int fromNode) {
int max = -1;
for (int toNode = 0; toNode < nodeCount; ++toNode)
{
if (fromNode != toNode && nodes[toNode][fromNode] > max) {
max = node[toNode][fromNode];
}
}
return max;
}
答案 2 :(得分:-1)
如果您愿意牺牲一些空间,可以添加额外的数组来跟踪到目前为止特定列/行所看到的最大距离以及该距离对应的节点。
答案 3 :(得分:-1)
描述它。除非这是一个主要的瓶颈,否则我倾向于清晰(可维护性)而不是聪明。
在数组上线性循环是现代处理器做得相当好的事情,O(N)方法通常运行得很好。
有数千个节点,我希望你的旧Pentium III能够达到每秒几万亿! :)