2010-11-26 93 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] 

很容易嘗試變化這種方法:這個想法是選擇合適形狀的曲線和規模,以適應列表的長度,所以你可以嘗試不同曲線。我選擇了一條多項式曲線,但如果這不適合你,你可以選擇一個不同的曲線,例如指數曲線。