2010-11-26 88 views
2

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

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

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

+2

URL的2000个字符长度是由GET方法引起的吗?然后转换为使用POST代替 – ajreal 2010-11-26 13:24:30

+0

@ajreal - 好主意,但由于技术原因,我无法使用它。 – manixrock 2010-11-26 16:37:42

回答

4

这个怎么样?没有PHP,我已经使用Python,但我希望它很清楚。询问是否。

设ℓ为开头的值的个数,n为您想要削减的值。然后这个想法是找到最大的指数x这样nx小于l。然后,我们可以选择使用索引的项目是最接近的整数

ℓ - (ñ - 1)X - 1,ℓ - (ñ - 2)X - 1,...,ℓ - 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] 

很容易尝试变化这种方法:这个想法是选择合适形状的曲线和规模,以适应列表的长度,所以你可以尝试不同曲线。我选择了一条多项式曲线,但如果这不适合你,你可以选择一个不同的曲线,例如指数曲线。