IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 使用Python异序词检测示例_清点法_排序法_蛮力法_计数法 -> 正文阅读

[Python知识库]使用Python异序词检测示例_清点法_排序法_蛮力法_计数法

要展示不同数量级的算法,一个好例子就是经典的异序词检测问题。如果一个字符串只是重排了另一个字符串的字符,那么这个字符串就是另一个的异序词,比如 heart 与 earth ,以及 python 与 typhon 。

为了简化问题,假设要检查的两个字符串长度相同,并且都是由26个英文字母的小写形式组成的。我们的目标是编写一个布尔函数,它接受两个字符串,并能判断它们是否为异序词。

1、方案1:清点法

def anagram_solution1(s1, s2):  # 清点法
    alist = list(s2)
    # 首先将s2存入alist列表,存这里的目的是为了
    # 核对一个核销一个(将对应的位置value设置为None)
    pos1 = 0
    stillOK = True

    while pos1 < len(s1) and stillOK:
        pos2 = 0
        found = False
        while pos2 < len(alist) and not found:
            # 取出s1中的字母和s2所保存的列表的
            if s1[pos1] == alist[pos2]:
                found = True
            else:
                pos2 += 1
        if found:
            alist[pos2] = None
            # 对符合条件的进行核销
        else:
            stillOK = False
        pos1 += 1
    return stillOK


print(anagram_solution1('heart', 'earth'))

通过分析可以给出公式: ∑ i = 0 n i = n ( n + 1 ) 2 = 1 2 n 2 + 1 2 n \sum_{i=0}^n i= \frac{n(n+1)}{2}=\frac{1}{2}n^2+\frac{1}{2}n i=0n?i=2n(n+1)?=21?n2+21?n
当n增大时,起决定性作用的是 n 2 n^2 n2,而 1 2 \frac{1}{2} 21?可以忽略。故该方案的时间复杂度是 O ( n 2 ) O(n^2) O(n2)

2、方案2:排序法

def anagram_solution2(s1, s2):
    alist1 = list(s1)
    alist2 = list(s2)

    alist1.sort()
    alist2.sort()

    pos = 0
    matches = True
    while pos < len(s1) and matches:
        if alist1[pos] == alist2[pos]:
            pos += 1
        else:
            matches = False
    return matches


print(anagram_solution2('heart', 'earth'))

表面上来看该算法的复杂度似乎是 O ( n ) O(n) O(n),但由于调用了sort()进行排序,排序时复杂度基本上是 O ( n 2 ) O(n^2) O(n2) O ( n l o g n ) O(nlogn) O(nlogn),所以排序操作起主导作用。

3、蛮力法

用蛮力解决问题的方法基本上就是穷尽所有的可能。就异序词检测问题而言,可以用 s 1 s1 s1中的字符生成所有可能的字符串,看看 s 2 s2 s2是否在其中。但这个方法有个难处。显然暴力是时间复杂度最高的算法,很多时候并不是最优先考虑的方向。

4、计数法

计数法顾名思义就是建立一个容纳所有元素的容器,例如这里是26个字母,记录每个字母出现的次数,然后进行比对。
总步骤数: T ( n ) = 2 n + 26 T(n)=2n+26 T(n)=2n+26 即: O ( n ) O(n) O(n)

其中 ord() 函数作用是返回对应的 ASCII 数值,或者 Unicode 数值。

def anagram_solution4(s1, s2):
    c1 = [0] * 26
    c2 = [0] * 26
    for i in range(len(s1)):
        pos = ord(s1[i]) - ord('a')
        c1[pos] = c1[pos] + 1
    for i in range(len(s2)):
        pos = ord(s2[i]) - ord('a')
        c2[pos] = c2[pos] + 1
    j = 0
    stillOk = True
    while j < 26 and stillOk:
        if c1[j] == c2[j]:
            j += 1
        else:
            stillOk = False
    return stillOk
    
print(anagram_solution4('heart', 'earth'))

对上面方法进行封装

def anagram_solution4(s1, s2):
    c1 = count1(s1)
    c2 = count1(s2)
    j = 0
    stillOk = True
    while j < 26 and stillOk:
        if c1[j] == c2[j]:
            j += 1
        else:
            stillOk = False
    return stillOk


def count1(s):
    c = [0] * 26
    for i in range(len(s)):
        pos = ord(s[i]) - ord('a')
        c[pos] = c[pos] + 1
    return c

print(anagram_solution4('heart', 'earth'))
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:14:01  更:2022-04-06 16:16:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:21:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码