【问题标题】:I need an array reduction algorithm for a graph我需要一个图形的数​​组缩减算法
【发布时间】:2010-11-26 11:54:43
【问题描述】:

我正在尝试使用谷歌图表显示一些数据点,但不幸的是,我可以使用的 url 长度限制为大约 2000 个字符,这意味着我可以使用大约 200 个数据点来显示图形。我有大约 800 个数据点并且还在增长,所以我需要将它们减少到 200 个以用于图表。现在我只是去掉 X=(800/200)-1 点然后跳过一个(并重复)到 200。

但是,大多数数据点位于数组的开头,因为这些点在图表上的位置呈指数级扩展(大约 1.2 指数)。最重要的点也是最近的点(在数组的末尾)。所以我需要一种方法来减少点数组,以便将大多数点留在数组的末尾,并在开头删除大部分(但不是全部)。

这将在每次制作图表时使用,因此它必须是确定性的(即不涉及随机)。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 2000字长的URL是GET方式造成的吗?然后转换为使用 POST 来代替
  • @ajreal - 好主意,但由于技术原因我不能使用它。

标签: php arrays algorithm graph


【解决方案1】:

这个怎么样?手头没有 PHP,我使用过 Python,但我希望它很清楚。如果没有,请询​​问。

让 ℓ 是你必须开始的值的数量,n 是你想要减少到的数字。然后的想法是找到最大的指数 x 使得 nx 小于 ℓ。然后我们可以选择索引是最接近整数的项目

ℓ - (n - 1)x - 1, ℓ - (n - 2)x - 1, ..., ℓ - 1x - 1, ℓ - 0x - 1

它们之间的间距很好,偏向列表的末尾。

import math
def select_with_bias(s, n):
    """Select n values from the list s if possible, with bias to later values."""
    l = len(s)
    if l <= n:
        return s[:]         # List is short: return copy of whole list.
    if n < 2:
        return s[-n:]       # If n is 1, last item only; if n is 0, empty list.
    x = math.log(l - 1, n)  # Shorthand for log(l - 1) / log(n)
    result = []
    for i in xrange(n - 1, -1, -1): # Loop from n-1 down to 0.
        result.append(s[l - int(i ** x) - 1])
    return result

(对于 Python 专家:这不是 Python 中最惯用的方法,但我想尽可能让不懂 Python 的程序员明白这一点。)

例如:

>>> select_with_bias(range(100), 10)
[19, 36, 51, 64, 75, 84, 91, 96, 98, 99]
>>> select_with_bias(range(100), 20)
[8, 15, 22, 29, 36, 42, 48, 54, 60, 65, 70, 75, 80, 84, 88, 91, 94, 97, 98, 99]

尝试这种方法的变体很容易:这个想法是选择正确形状的曲线并对其进行缩放以适应列表的长度,这样您就可以尝试不同的曲线。我选择了多项式曲线,但如果这不适合您,您可以选择其他曲线,例如指数曲线。

【讨论】:

  • 谢谢你,我在弄清楚如何不重叠所选位置时遇到了麻烦,但看看你的例子,现在看起来很明显。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2013-04-26
  • 2011-06-21
  • 2020-06-18
  • 2015-11-04
  • 1970-01-01
相关资源
最近更新 更多