C++函数在浮点数列表中查找模式



我有一个包含18个浮点值的列表。包含在这个浮动列表中的是一个出现两次的单一模式。我希望能够在不向程序提供特定模式的情况下挑选出这种模式。

我已经在白板和Visual Studio中尝试过多次计划。一旦找到每个模式的第一个浮点值,我就一直在尝试向前/向后迭代以找到一个连续的模式。我也在网上找了一些例子,但如果没有给出具体的模式,我就找不到任何在列表中找到任何现有模式的例子。

谢谢,我感谢所有的投入/帮助!

我陷入困境的地方:

std::vector<float> RandomFloats =
{
8.74,
7.76,
9.45,
7.41, // Pattern Begin
8.91,
9.55,
7.01,
9.63, // Pattern End
10.0,
8.67,
7.78,
7.41, // Pattern Begin
8.91,
9.55,
7.01,
9.63, // Pattern End
7.58,
9.65,
8.18
};
const static int FloatCount = RandomFloats.size();
for (int i = 0; i < FloatCount; i++)
{
float fParent = RandomFloats.at(i);
for (int j = 0; j < FloatCount; j++)
{
float fChild = RandomFloats.at(j);
if (fChild != fParent)
continue;
// Check for continued pattern here.
}
}

看起来您的当前方法是正确的。它不是特别有效,但它会完成任务。

一个问题是j循环从索引0开始。这是不必要的,会给你带来额外的困惑。想想该代码的含义("语义"(。目标是找到值在位置i处的下一次出现。现在,你正在整个向量中搜索它,它实际上会找到你当前使用的值,甚至是之前出现的值。你不想那样!

因此,在位置i + 1开始循环,而不是在0:

for (int i = 0; i < FloatCount; i++) {
for (int j = i + 1; j < FloatCount; j++) {
//   ^^^^^^^^^
}
}

然后,您只需要在"在这里检查连续图案">部分代码。想想这需要做什么。它是寻找一个匹配值的序列,这样序列就不会重叠。

想想你当时所知道的。您已经发现索引i和索引j标记了序列的潜在开始,因为向量中的值相等。现在,您需要检查后面的每个值,直到它们不匹配,或者到达向量的末尾。

将这些单词放入代码中:

int ii = i + 1;
int jj = j + 1;
while (jj < FloatCount &&    //<-- don't run off end of array
ii < j &&             //<-- don't allow sequences to overlap
RandomFloats[ii] == RandomFloats[jj])
{
++ii;
++jj;
}

之后,您就知道iijj索引都在序列末尾之后。因此其长度的计算很简单:

int sequenceLength = ii - i;

最后一点是你的练习:

如果一个序列可能包含两个相同的值,或者更一般地说,如果任何值在任何地方都可以出现不止一次,那么你还需要检查你找到的序列是否比你以前找到的任何序列都好。

要做到这一点,您需要一些变量记住迄今为止最好的序列长度,以及该序列的两个起点在哪里。然后,只要发现重复的序列,就可以轻松地检查它,并在必要时进行更新。

如果我没有错的话,您正在寻找的是对重复时间最长的子字符串问题的自适应。

在最初的问题中,给定一个字符串,您希望找到最长的重复减法,这可以在O(n)操作中使用后缀树来完成。你的问题是完全一样的,但有数字(每个数字都是一个字母(,因此,后缀树应该改变,这样它就可以存储数字而不是字符。

采用同样的方法也可以在这里工作,你可以在这里查看。(我已经检查了你的输入,它运行得很好,尽管它寻找的是重复出现的字母而不是数字,因此效率较低(。

一般来说,有时你想找到一个相似的问题,但有一个解决方案,比如这里,从一个字段中获取解决方案,并将其导入另一个字段是很常见的。

最新更新