2014-11-05 68 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