根据第一个数组的索引查找第二个数组的值

时间:2015-11-16 20:01:43

标签: arrays algorithm

假设我有以下两个数组,同时还有一个keyValue对象。

int[] values = {3, 1, 1, 2, 3};
int[] keys   = {6, 5, 5, 6, 9};
int   keyValue = 7;

我正在尝试为value找到小于key的最大keyValue。在上面的例子中,我们正在寻找7.在这种情况下,正确的答案是3,因为最大的key <= 7是6. keys中的6的索引是0和3.所以我会查看value[0]value[3],找出最大的value[0] = 3

如果我重新排序keys,我需要求助于确保索引匹配,所以我希望两个列表保持一致。

我可以使用强力算法并执行类似这样的操作

int foundValue = 0;
int foundKey = 0;
Foreach ( int x = 0; x < keys.length; x++ ){
    if ( keys[x] <= keyValue && keys[x] >= foundKey) {
      foundKey = keys[x];
      if(values[x] > foundValue){
         foundValue = values[x];
      }
   }
}

虽然有效,但并不是那么优雅。问题是我实际上需要根据更改values[x]keyValue求和,而不能包含重复。例如

keyValue = 7    :    foundValue = 3
keyValue = 7    :    foundValue = 2   //because value[0] was already used
keyValue = 5    :    foundValue = 1   
keyValue = 10   :    foundValue = 3
keyValue = 7    :    foundValue = 1   //because all the 6 and one 5 value are used

是否有比蛮力更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

让我们忽略&#34;优雅&#34;对当下的要求,并首先处理真正的问题,这就是你

  

需要根据更改的values[x]keyValue求和,并且不能   包括重复。

要防止重用值,您应该添加used[]数组,如下所示。以下算法还允许通过添加keyValue循环来更改while

int[] values = {3, 1, 1, 2, 3};
int[] keys   = {6, 5, 5, 6, 9};
bool[] used  = {false, false, false, false, false};
int   keyValue;

while (<We have a new keyvalue to try>) {
    keyValue = <new value>;
    int foundValue = 0;
    int foundKey = 0;
    Foreach ( int x = 0; x < keys.length; x++ ){
        if ( keys[x] <= keyValue &&
             keys[x] >= foundKey &&
             !used[x])
        {
            foundKey = keys[x];
            if(values[x] > foundValue) {
                foundValue = values[x];
                used[x] = true;
            }
        }
    }
}

为了使上述更优雅,您可以执行以下操作:

  • 将键和值组合在一起
  • 按键降序排列键/值对
  • 在搜索循环中,只要密钥匹配
  • ,就可以跳到下一次迭代
  • 您还可以检查used[]数组中至少有一个条目是false,因为如果全部都是true,那么算法就可以暂停了。< / LI>