【问题标题】:How to scale binary array keeping the values如何缩放二进制数组以保持值
【发布时间】:2019-04-02 09:32:35
【问题描述】:

我希望将数组缩放到给定的长度。

第一个数组 [A] 仅包含 0 和 1 值,并且具有恒定大小,例如 8。

另一方面,我有一个可变长度的数组 [B],具体取决于程序的操作。我想逐个索引比较两个索引。数组 [A] 可以理解为模式,而 B 是随时间拉伸的数据。结果是模式和数据之间的差异

A = [0 1 0 1 1 0 0 1]
B = [0 0 1 1 0 0 1 0 0 0 1]

以下情况: B.size % A.size == 0 很简单,但我不能假设。

我想到的第一个解决方案是找到最小的公倍数并将两个表都缩放到它,但我担心它会非常低效。

我正在寻找一种解决方案,以尽可能准确地将 [A] 缩放到 [B] 的大小。我用 c ++ 编写程序,但我会感谢所有提示。

【问题讨论】:

  • 如果您从右到左方向,您仍然可以比较“数组”。否则将A 复制到一个新的“数组”(向量?)并添加前导零,直到长度与B 相同。
  • 我不使用向量。如果长度之间的差异很大,例如 8 和 999,则此解决方案将不会通过。在最好的简单情况下,A = [0, 1] B = [0 ,0 ,0, 1, 1, 1] 程序应该返回数组之间没有差异。
  • 上述评论示例中B = [0 ,0 ,0, 1, 1, 1, 0]时的o/p是什么?
  • 好吧,您似乎有矛盾的要求:您不能在“保留值”的同时缩放数据。另外,您说B(在您的示例中)是“随着时间的推移拉伸的数据”(强调我的)。这个拉伸是怎么做的?您不能立即应用这种拉伸而不是“随着时间的推移”进行吗?
  • @SparKot 这是使用什么方法来保持高精度的问题。在这种情况下,程序可以返回差异 = 1,但我关心的是忠实地找到一个模式

标签: c++ arrays algorithm


【解决方案1】:

似乎有两个不同的问题,一个是拉伸向量 A 以匹配向量 B 的大小(不是 C++ 意义上的向量),然后找到一个比较函数来测试结果向量是否足够相似认为相等。对于第一部分,这是一种计算因子的方法,A 中的索引需要乘以该因子才能投影到 B 中的索引上。

#include <iostream>

using namespace std;

int main()
{
    const int NumA = 8;
    const int NumB = 11;

    int a[NumA] = { 0, 1, 0, 1, 1, 0, 0, 1 };
    int b[NumB] = { 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1 };

    int a2b[NumB]; // a stretched to size of b

    // factor to calculate a 'stretched a' index in a2b
    double factor = NumB / (double)NumA;
    int lastIndex = 0;

    for (int i = 0; i < NumA; i++)
    {
        int index0 = (int)(i * factor); // where the next value is stored
        int index1 = (int)((i+1) * factor); // 'stretch' the value up to here
        for (int j = index0; j < index1; j++)
        {
            a2b[j] = a[i];
            lastIndex = j;
        }
    }
    for (++lastIndex; lastIndex < NumB; lastIndex++)
    {
        // fill last value gap, if any, due to float truncation
        a2b[lastIndex] = a[NumA - 1];
    }

    for (int i = 0; i < NumB; i++)
        std::cout << a2b[i] << " ";

    std::cout << endl;
}

输出是

0 1 0 0 1 1 0 0 0 1 1

如您所见,它与 B 不完全匹配。对于 A = [0, 1] B = [0 ,0 ,0, 1, 1, 1],输出为

0 0 0 1 1 1

这并没有解决问题的第二部分,即确定平等。为相等性测试选择的逻辑很可能会改变拉伸向量的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多