2014-11-05 38 views
0

我有一個Gtk.TreeView與自定義模型(繼承自Gtk.TreeModel),我顯示〜150K行。我正在使用PyGtk,但它應該沒那麼重要。在排序的列中優化pygtk/gtk TreeView交互式搜索?

圖形用戶界面交互是可以的,但是當激活交互式搜索時,它需要永久(每個字符~10秒)。 根據我對Searching a ListStore的理解和測試,交互式搜索會檢查ListStore的每一行(內部存儲爲鏈接列表)以查找值。

由於我正在搜索排序的列,我想進行二分搜索。

我該怎麼做?我是否需要重新編程從頭開始的交互式搜索? 罐頭TreeModelSort將會有用嗎? (我沒有得到它的內部管理如何)

如果我推出我自己的搜索用戶界面,我不知道如何開始。 草圖看起來像這樣:

  1. Disable built-in interactive search
  2. 創建搜索的用戶界面,並將其連接到正確的按鍵
  3. 做手工數據的我的自定義表示的二進制搜索(或排序顯示行,如果隨機訪問是可能的)
  4. 選擇正確的匹配。

對於3.從​​是要行隨機存取看來:

一個gtk.TreeModel對象支持一些Python的映射協議,它允許您檢索gtk.TreeModelRow對象代表模型中的一排。

它是真正有效的隨機訪問嗎?

回答

0

目前還不清楚你是如何實現自定義gtk.TreeModel - 是ListStore,還是你自己推出的東西?即使擁有150K行,目前尚不清楚搜索列表存儲需要10秒鐘的時間。

可以在ListStore上執行二進制搜索,但TreeView執行的搜索不是二進制的,它只是將列表從當前位置掃描到結尾,尋找匹配項。它允許自定義"equals" callback,但不允許搜索策略。你需要的是一個更一般的搜索函數,它接受一個鍵並返回樹中相應的位置。

爲了實現大樹的高效搜索,您需要按照您在編輯中列出的內容的問題滾動您自己的搜索UI。看看現有的實現,它沒有太多的工作:它歸結爲顯示頂級gtk.WINDOW_POPUP窗口,其中包含一個條目,其activate信號連接到代碼,該代碼可以搜索並將樹形光標定位到它找到的行。

+0

我編輯的問題更清晰:在我看來,TreeModel實現隨機訪問,但我作爲底層TreeStore dont感到困惑。 什麼是事實? – 2014-11-12 19:13:59

+0

@BastienJacquet請注意,'TreeModel'是接口,'TreeStore'和'ListStore'是它的具體實現,其中你正在使用後者。'ListStore'不是一個鏈表,它使用'GSequence'實現,它在內部是一個暴露序列API的樹。 'GSequence'(因此'ListStore'被設計用於擴展,使得在列表中的任何地方都可以插入'O(log n)',以及'O(log n)'隨機訪問,這意味着它實際上是*可能的使用'ListStore'實現二分搜索,預期複雜度爲'O(log^2 n)'。 – user4815162342 2014-11-13 18:54:38