命名该技术(可称为“搭载”)

时间:2010-03-04 23:24:58

标签: algorithm language-agnostic nomenclature

以下方法/技术的名称是什么(我会尽力描述最好的,“memoization”背景可能需要理解为什么这种技术非常有用) :

你启动了一些潜在的长度异步计算,你意识到相同的计算已经启动但尚未完成并且你在第一次计算时“捎带”。然后,当第一个计算结束时,它不会发出一个而是两个回调。

目标是不要不必要地开始第二次计算,因为你知道已经有相同的计算在运行。

请注意,尽管并非完全不同,但我并不是在寻找“memoization”的特殊缓存情况:memoization是指当你开始计算并找到同一计算的缓存(memoized)结果时已完成,您可以重复使用。

这里我正在寻找技术的名称,其方式与memoization有点类似(因为它可能对于memoization是一种有用的技术的某些原因很有用),除了它重用第一次计算的结果,即使在你发出第二次计算时第一次计算还没有完成

我总是把这种技术称为“捎带”,但我不知道这是否正确。

我实际上不止一次使用过这种“类固醇记忆”,它非常方便。

我只是不知道这个(高级?)技术的名称是什么。

修改

该死的,我想对epatel的答案发表评论,但它消失了。 epatel的回答给了我一个想法,这种技术可以称为“lazy memoization”:)

4 个答案:

答案 0 :(得分:4)

这只是期货的备忘录

正常的“渴望”的记忆就像这样:

f_memo(x):
  critical_section:
    if (exists answers(f,x))
      return answers(f,x)
    else
      a = f(x)
      answers(f,x) = a
      return a

现在,如果f(x)返回期货而非实际结果,则上述代码按原样。你得到了搭载效果,就像这样:

  1. 第一个线程调用f(3)
  2. f(3)没有存储的答案,所以在关键部分有一个f(3)的调用。 f(3)实现为返回未​​来,所以'答案'立即就绪;上面代码中的'a'设置为未来F,未来F存储在答案表中
  3. 未来的F作为电话f(3)的“结果”返回,可能仍在进行中
  4. 另一个线程调用f(3)
  5. 未来的F从表中找到,并立即返回
  6. 现在两个线程都处理计算结果;当他们试图读取它时,它们会阻塞直到计算准备好了 - 在帖子中,这个通信机制被提到是通过回调实现的,假设在期货不太常见的情况下

答案 1 :(得分:2)

答案 2 :(得分:2)

在某些情况下,我听说过“请求合并”。

答案 3 :(得分:1)

听起来有点像Lazy Evaluation,但不完全是......