为了加快速度,您可能应该计算所有可能的答案,并将输入存储到每个答案中。
然后,我建议制作某种使用答案作为键的查找表(因为答案都是唯一的),然后存储获得该结果的所有可能输入。
为了帮助可视化:
假设您有桌子“桌子”。在 Table 内部,您有键,并且与这些键相关联的是值。您所做的是使密钥具有您的答案所采用的任何格式的类型(密钥将是您的所有答案)。现在,为您的 400k 输入提供一个唯一标识符。然后,您将乘法的唯一标识符存储为与该特定键关联的一个值。当您再次计算相同的答案时,您只需将其添加为可以计算该键的另一组输入。
例子:
Table<AnswerType, vector<Input>>
定义输入,如:
struct Input {IDType one, IDType two}
其中一个“输入”可能具有 ID 12384、128,这意味着由 12384 和 128 标识的对象相乘时将给出答案。
因此,在您的查找中,您将拥有如下所示的内容:
AnswerType lookup(IDType first, IDType second)
{
foreach(AnswerType k in table)
{
if table[k].Contains(first, second)
return k;
}
}
// Defined elsewhere
bool Contains(IDType first, IDType second)
{
foreach(Input i in [the vector])
{
if( (i.one == first && i.two == second ) ||
(i.two == first && i.one == second )
return true;
}
}
我知道这不是真正的 C++ 代码,它只是作为伪代码,它是一个粗略的原样,但它可能是一个开始的地方。
虽然 foreach 可能仅限于线性搜索,但您可以通过对输入的存储方式进行排序来使“包含”方法运行二进制搜索。
总之,您正在查看将在 O(n^2) 时间内运行的一次性应用程序,以及将在 nlog(n) 中运行的查找。不过,我并不完全确定在所有这些之后记忆会如何。当然,我对它背后的数学了解不多,所以如果你能以某种方式对键进行排序,你也许可以加快线性搜索。