V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
HelloAmadeus
V2EX  ›  Python

一个关于字符串搜索的问题

  •  
  •   HelloAmadeus · Jun 4, 2019 via iPhone · 3029 views
    This topic created in 2521 days ago, the information mentioned may be changed or developed.

    有一个长度为 50 万的字符串列表,现在要查找某个字符串是不是这些字符串的字串,找到所有符合的字符串. 我用 python 遍历实现了一遍,性能不太满足,各位有没有什么建议?

    16 replies    2019-06-06 14:24:26 +08:00
    kirigaya
        1
    kirigaya  
       Jun 4, 2019
    动态规划里的字符串查找?
    goreliu
        2
    goreliu  
       Jun 4, 2019 via Android
    可以用 c 实现试试,如果性能还不行的话再用 kmp 优化下。直接在 python 优化可能效果不佳。
    VDimos
        3
    VDimos  
       Jun 4, 2019 via Android
    你代码呢?
    pmispig
        4
    pmispig  
       Jun 4, 2019
    你肯定用的单线程姿势吧,这个可以优化成多线程的
    geelaw
        5
    geelaw  
       Jun 4, 2019
    字串 => 子串?

    首先选择一个不出现在任何字符串里的一个字符 c,例如 c 选择 \0,然后把所有字符串接在一起 S = s1 \0 s2 \0 ... \0 sn,接着制作 S 的后缀树(线性时间),然后就可以很容易做你需要的事情了。

    具体实现上,你不需要真的构造出 S 这个字符串,在制作后缀树的过程中可以 virtually 表示它。
    hmzt
        6
    hmzt  
       Jun 4, 2019
    正则,应该比你自己写的快
    testeststs
        7
    testeststs  
       Jun 4, 2019
    python 能没有现成的轮子?我不信。
    没做过这么长的字符串,大概需要多少时间?
    dongyx
        8
    dongyx  
       Jun 4, 2019
    不放设列表里有 n 个字符串,每个串长为 m。不管怎么做,第一次匹配都逃不了 O(nm)的时间复杂度。

    如果你就匹配一次,直接用 KMP 挨个匹配就好,O(nm)。

    如果你有多个模式串,要匹配多次,建议先把 n 个文本串建成一颗 Trie 树,建树的时间是 O(nm),以后每次匹配的时间只需要 O(m)。
    dongyx
        9
    dongyx  
       Jun 4, 2019
    不好意思,上面第二个方案说错了,是把 n 个文本串的所有后缀建成一颗 Trie 树,建树时间是 O(n * m^2)。
    HelloAmadeus
        10
    HelloAmadeus  
    OP
       Jun 4, 2019 via iPhone
    @geelaw 是子串,不好意思搞错了。后缀树研究过一点,不确定好不好用,试一下实现一个
    HelloAmadeus
        11
    HelloAmadeus  
    OP
       Jun 4, 2019 via iPhone
    @dongyx 是多次匹配,trie 树考虑过,内存占用不能接受
    kedadiannao220
        12
    kedadiannao220  
       Jun 5, 2019
    sed
    awk
    azh7138m
        13
    azh7138m  
       Jun 5, 2019 via Android
    @hmzt 字母大量重复的场景下,正则的性能就很低(
    bnbdfg
        14
    bnbdfg  
       Jun 5, 2019
    50 万长度,python 不太好实现你这种性能要求
    BiteTheDust
        15
    BiteTheDust  
       Jun 5, 2019
    用后缀自动机可以很简单的实现
    longchisihai
        16
    longchisihai  
       Jun 6, 2019
    试试看 flashtext
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2916 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 15:13 · PVG 23:13 · LAX 08:13 · JFK 11:13
    ♥ Do have faith in what you're doing.