如果標題的描述不夠準確,道歉。減少從二次到更快的重複字符串搜索
我有一個程序,搜索元音字符串,但它通過滑動整個字符串的特定大小的窗口。我想計算元音的密度。假裝我不在乎有空白和符號;它只是留在那裏。我已經編碼爲明顯的解決方法如下:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit ... consequat."
# assume s continues after the "..."
v = "aeiou"
v_dict = {}
max_win_size = 100
if max_win_size > len(s): max_win_size = len(s)
for i in range(1, max_win_size):
v_dict[i] = {}
for j in range(0, i+1):
v_dict[i][j] = 0 # set counts to zero
for j in range(1, len(s)-i+1):
s_slice = s[j:j+i].lower()
v_count = sum([s_slice.count(c) for c in v])
v_dict[i][v_count] += 1
這使最終讓我元音的頻率在1到字符串的大小不同的滑動窗口。這個程序按我想要的方式工作,但問題在於它非常緩慢。它顯然是二次的,我想提高效率,因爲隨着文本越來越大,程序需要花費更多的時間。問題是我不確定如何將問題空間轉換爲更高效的算法。
有沒有人有任何想法,如何做到這一點,比如說,線性?
編輯:
我試圖通過本福格特由cr1msonB1ade實現了答案。它像廣告一樣工作。另外,我認爲我會將經驗證據包含在速度聲明中。
首先是增加字符串大小的運行時間。兩個函數都是線性執行的,但是使用純python實現它的開銷會導致線性運行時間的係數更大。
其次是增加窗口大小的運行時間。我修正了窗口大小,並且運行了更大和更大的窗口大小。這一次,我的函數的二次函數顯示了它本身,而numpy累加和函數保持線性。
我看不出max_win_size是怎麼用的 – AdamSkywalker
我猜max_win_size應該是第一個循環的範圍。它應該取代len(s)。 – cr1msonB1ade
修復了缺少max_win_size的問題。 – user1502381