适合搜索的数据结构

时间:2014-05-01 18:54:33

标签: python algorithm sorting search

我有共同的问题。我有一些数据,我想在其中搜索。我的问题是,我不知道适合这种情况的正确数据结构和算法。

有两种对象 - ProcessPackage。两者都有一些属性,但它们只是数据结构(没有任何方法)。接下来,有PackageManager和可以称为ProcessManager的东西,它们都有函数返回属于某些Package的文件列表或某些Process使用的文件。

从语义上讲,我们可以将这些数据想象为

软件包:

  • Package_1
    • file_1 _ file_2
    • file_3
  • Package_2
    • file_4
    • file_5
    • file_6

实际上属于Package_k的文件可以属于Package_l for k!= l: - )

过程:

  • Process_1
    • file_2
    • file_3
  • Process_2
    • file_1

进程使用的文件对应于包所拥有的文件。此外,规则并不适用于包 - 这意味着,n进程可以同时使用同一个文件。

现在任务是什么。我需要在进程和包之间找到一些匹配 - 对于给定的包列表,我需要找到使用包所拥有的任何文件的进程列表。

我的临时解决方案是制作[package_name, package_files]列表和[process_name, process_files]列表以及我搜索每个搜索匹配的每个进程的每个文件的每个包中的每个文件,但当然它可能只是临时解决方案vzhledem到了可怕的时间复杂性(即使我对文件进行排序并使用二进制搜索)。

您可以推荐我进行此类搜索吗? (我在python中编码)

2 个答案:

答案 0 :(得分:0)

根据我对你要做的事情的理解 - 给定一个文件名,你想找到一个使用该文件的所有进程的列表,这段代码应该有所帮助:

from collections import defaultdict 

# First make a dictionary that contains a file, and all processes it is a member of.
file_process_map=defaultdict(list)
[file_process_map[fn].append(p) for p in processes for fn in p.file_list]

基本上,我们将现有结构(进程有一个或多个文件)转换为我们有文件名的结构,以及使用它的进程列表。

现在当你有一个文件需要搜索(在流程中)时,只需在" file_process_map"中找到它。字典,您将拥有使用给定文件的所有进程的列表。

这里假设"处理"是一个对象列表,每个对象都有一个file_list属性,其中包含相关文件的列表。显然,根据您的数据结构,您可能需要更改代码..

答案 1 :(得分:0)

与集合进行匹配应该更快:

watched_packages = [Package_1, Package_3]   # Packages to consider

watched_files = {    # set comprehension
    file_
    for package in watched_packages
    for file_ in package.list_of_files
}

watched_processes = [
    process
    for process in all_processes
    if any(
        file_ in watched_files
        for file_ in process.list_of_files
    )
]