我需要一个图表的数组缩减算法

时间:2010-11-26 11:54:44

标签: php arrays algorithm graph

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

然而,大多数数据点都位于数组的开头,因为图上的点位置在某种程度上呈指数级增长(约为1.2指数)。最重要的一点是最新的(在数组末尾)。所以我需要一种方法来减少点数组,以便将大多数点留在数组的末尾,并将大部分(但不是全部)移到开头。

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

1 个答案:

答案 0 :(得分:4)

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

设ℓ是您必须开始的值的数量, n 是您要将其剪切为的数字。然后想法找到最大的指数 x ,使 n x 小于ℓ。然后我们可以选择具有与

最接近的整数的索引的项目
  

ℓ - ( n - 1) x - 1,ℓ - ( n - 2)< sup> x - 1,...,l - 1 x - 1,ℓ - 0 x - 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]

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