1

我有 2 个 3x3 矩阵,每个矩阵都以 2D 数组表示。第一个矩阵包含元素[我存储 PID,因此,元素的范围可以从数百万开始,我只是将其简化为 A 在我的实际应用中它是一个整数范围,A 可以是 200,B 可以是 200000] 例如,矩阵元素

{ A B C
  B D C
  C F B }

second 持有每个位置的权重,例如矩阵权重

{ 9 7 5
  8 6 1
  7 5 4 }

所以在上面的例子中,B 是最重的元素,因为它的权重是 7+8+4,其次是 C 等等,

如何找出前 3 个最高元素?

一种解决方案是:是将元素存储在一个单独的数组中 A[9][2](元素,值和唯一)循环元素矩阵,然后另一个循环遍历值数组并填充与元素对应的值. [迭代创建9x2键值矩阵,迭代排序,迭代删除重复项(因为需要合并权重),-有更好的方法吗?]

还有其他有效的方法吗?[提示:我只需要 3 个,所以我不应该使用 9x2]

4

2 回答 2

2

假设您知道您只有A-Z可用的字母并且它们是大写字母。

char elems[3][3] = {
    { 'A', 'B', 'C' },
    { 'B', 'D', 'C' },
    { 'C', 'F', 'B' }
};

你也同样设置了你的权重......

您可以像这样跟踪计数:

int counts[26] = {0};

for( int i = 0; i < 3; i++ ) {
    for( int j = 0; j < 3; j++ ) {
        counts[elems[i][j] - 'A'] += weights[i][j];
    }
}

那么这只是找到三个最大计数的索引的一个案例,我相信你可以轻松做到这一点。

于 2013-01-21T22:27:41.150 回答
2

忘记它们是二维数组,并将两个数据源合并为一个数组(成对)。对于您的示例,您将获得{{'A', 9}, {'B', 7}, {'C', 5}, {'B', 8}, ...}. 对这些进行排序(例如,使用qsort),然后浏览列表,随时求和 - 并保留您找到的得分最高的 3 个键。

[此解决方案始终有效,但仅在数组很大时才有意义,在重新阅读问题时它们不是]。

于 2013-01-21T22:46:51.703 回答