如何避免双循环?

时间:2017-12-07 12:29:42

标签: ios algorithm typescript

从healthkit,我将收到一些数据,例如步骤数据。

我在服务器中保存了这个数据。然后我有一个数据数组:

1.- startDate,endDate,value

2.- startDate,endDate,value

我的服务器中可能有很多值。

然后我获取Healthkit中的值。我有很多价值观。服务器中的值和新值。

我想只向服务器上传新值。

我这样做:

for each value in my server {
    for each value in healthkit{
        if(startDate, endDate and value are not equal to the value in the server){
            then save the value in the server
        }
    }
}

算法会起作用,但速度非常慢。我可以在两个系统中拥有很多值。他们中的大多数在两个地方都是一样的。

您知道如何做得更好吗?

我无法在healthKit中保存标记。

我正在使用带角度4和打字稿的离子。

2 个答案:

答案 0 :(得分:0)

我认为我需要更多的背景来理解这个问题。通过" new"值,您是否包括已修改的条目,或仅包含已添加的新条目?

如果您只需要新值,并且它们被添加到客户端数组的末尾,那么您可以从数组的末尾获取它们。

const new_count = healthkit.length - myserver.length, // number of new entries
index_start = healthkit.length - new_count, // index in healthkit array where new entries start
new_values = healthkit.slice(index_start); // new array containing only new entries

addNewValues(new_values);

现在您将新值放在一个单独的数组中,您可以将它们更新到服务器。

如果您需要更新已更改的值,则可以遍历两个阵列(仅一次,同时)并查找差异。我将假设两个数组的条目都在相同的索引中。我也假设"值" key是唯一要比较的键。您可以执行以下操作来查找已修改的值。

const modified_values = [];
myserver.forEach(function(entry, i) { // iterate over server array
    let healthkit_entry = healthkit[i]; // get healthkit entry with same index
    if(entry.value !== healthkit_entry.value) { // see if value has changed
        modified_values.push(healthkit_entry); // if changed, add to modified array
    }
});

updateModifiedValues(modified_values);

现在,modified_values数组包含了来自healthkit数组的所有已修改条目。

答案 1 :(得分:0)

这个答案假定服务器上的数据和healthKit中的数据以相同的方式排序,或者您可以对它们进行排序而不会影响其他任何内容。

例如,您可以通过StartDate对服务器上的数据和来自healthKit的数据进行排序,通过EndDate对连接进行分类,然后按值断开连接。

现在您有两个要合并的已排序数组。我们的想法是使用合并排序explained here.

的合并功能

您最终会得到一个包含所有数据但不重复的数组,您可以将其保存在服务器上。

修改

void mergeArrays(int arr1[], int arr2[], int n1,
                             int n2, int arr3[])
{
    int i = 0, j = 0, k = 0;

    // Traverse both array
    while (i<n1 && j <n2)
    {
        // Check if current element of first
        // array is smaller than current element
        // of second array. If yes, store first
        // array element and increment first array
        // index. Otherwise do same with second array
        if (arr1[i] < arr2[j])
            arr3[k++] = arr1[i++];
        else if (arr2[j] < arr1[i]) 
            j++;
        else
            j++,i++;
    }

    // Store remaining elements of first array (healthKit Array)
    while (i < n1)
        arr3[k++] = arr1[i++];
}