【问题标题】:Any ideas on how to solve this matrix / 2x2D array computation?关于如何解决这个矩阵/2x2D 数组计算的任何想法?
【发布时间】:2013-01-21 22:10:31
【问题描述】:

我有 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]

【问题讨论】:

  • 创建一个唯一元素数组,在另一个数组中计算(求和)它们的权重,按第二个数组的值对第一个数组进行排序,ta daa!
  • 我会为此编写一些代码,与 Aziz 刚刚抛出的算法惊人地相似。
  • @AZIZ 为您的解决方案加分,但我认为有更有效的方法。
  • @purpletech 您的意思是在添加权重时跟踪每个步骤中最高的三个吗?如果不允许负权重,那也没关系。
  • 等等,数组真的是 3x3,这不仅仅是一个简单的例子?

标签: c


【解决方案1】:

假设您知道您只有字母 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];
    }
}

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

【讨论】:

  • 注意,如果您需要处理负权重,您必须将所有计数显式初始化为INT_MIN
  • 很好的解决方案。给出了分数,但我用更好的假设更新了这个问题。对不起。我真的不能使用 int counts[26] 我的范围确实很大,它不是字符 A,为了简单起见,我在示例中使用了 A。让我考虑一下。
  • 你可以用哈希表来索引它。你有整数,对吧?你对存储感兴趣吗?您可以拥有一个包含 31 个元素(为了论证)的合理稀疏的哈希表。它最多只能存储 9 个元素,并且每个元素发生碰撞的几率都非常低。如果您担心,请将桌子变大。使用质数。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我已经给出了这个解决方案作为我的答案之一。该解决方案使用额外的存储空间(一个 9x2 数组)并且查找重复项需要另一次迭代/计算以及另一次迭代/计算以进行排序。 (+1ing)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2012-12-14
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多