前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构学习-python实现01--0401

数据结构学习-python实现01--0401

原创
作者头像
到不了的都叫做远方
修改2020-04-02 10:16:58
4400
修改2020-04-02 10:16:58
举报

经过近两年多的转行自学,乱七八糟的学了不少的东西,依然没有走到自己想要去的方向,继续学习,努力吧!

本来学习机器学习,学了一遍sklearn,然后想从头学些常用算法,发现写代码的时候,还是需要数据结构方面的知识,于是暂缓继续机器学习的学习,把数据结构与算法过一遍,一点一点进步。

算法问题分类:

  • 1.what:判断与分类
  • 2.why:求因与证明
  • 3.how:过程与构建

我非常喜欢今天看的MOOC当中的老师讲解的这一段,虽然很基础,但是感觉他不单对我的算法学习进行了开导,而且对我现实生活的思考方式,有了一定的影响。

一、今天学习编写了三段小程序,是检查“变位词”的三种python算法:

第一种:逐字检查法:
def anagramSolution(s1, s2):
    if len(s1) == len(s2):  # 先查长短,快速判断
        alist = list(s2)  # 字符串可以索引,但不可变,将其变为列表
        pos1 = 0  # 位置参数
        stillOK = True  # 判别条件,由于需要跳出条件控制,及最终返回值
        while pos1<len(s1) and stillOK:
            pos2 = 0
            found = False  # 查找到具体值时使用的标记
            while pos2<len(alist) and not found:
                if s1[pos1] == alist[pos2]:
                    found = True
                else:
                    pos2 += 1
            if found:
                alist[pos2] = None
            else:
                stillOK = False
            pos1 += 1
        return stillOK
    else:
        return False
# 遇到的坑:
# 1、我在 if found 处缩进出了问题,当有重复字母时,不能识别,注意缩进,保证一次循环,只更改一个位置的值
# 2、忘记pos1 += 1,导致死循环,由于之前总是用for循环,导致使用while时忘记停止条件。

第二种算法:排序比较,老师说时间复杂度较高,sort()排序会比较耗时。
def sortword(s1, s2):
    alist = list(s1)
    blist = list(s2)
    
    alist.sort()
    blist.sort()
    pos = 0
    matches = True
    while pos<len(s1) and matches:
        if alist[pos] == blist[pos]:
            pos +=1
        else:
            matches = False
    return maches

第三种:计数比较法,相对最快。
def numcount(s1, s2):
    c1 = [0] * 26
    c2 = [0] * 26
    for i in range(len(s1)):
        pos = ord(s1[i]) - ord('a')  # 用ASCII码值标记位置
        c1[pos] += 1
    for i in range(len(s2)):
        pos = ord(s2[i]) - ord('a')
        c2[pos] += 1
    j = 0
    stillok = True
    while j < 26 and stillok:  # 判断每个字母出现的次数是否相同
        if c1[j] == c2[j]:
            j += 1
        else:
            stillok = False
    return stillok

其实有第四种,暴力法,没有试,需要学习。

二、今天学习了第一种线性结构--栈(一种有序的数据项的集合,遵循后进先出的原则LIFO)

栈可以用在很多地方,今天学习到的应用方面是:

  • 1.判断括号是否正确的闭合、推广可以判断前段页面的代码闭合情况。
  • 2.可以用于中缀、前缀、后缀表达式的计算问题。
# 一个基本的栈结构:用列表来实现栈,列表前段为栈底,后端为栈顶,这样使用append、pop会更快O(1)的复杂度
class Stack:
    def __init__(self):  # 创建栈,首先为空栈
        self.items = []
        
    def isEmpty(self):  # 判断栈是否为空,需要返回值,True/False
        return self.items == []
    
    def push(self, item):  # 入栈操作,不需要返回值,加入栈顶
        self.items.append(item)
        
    def pop(self):  # 出栈操作,有返回值,移除栈顶元素
        return self.items.pop()
    
    def peek(self): # 查看栈顶元素, 有返回值
        return self.items[len(self.items)-1]
    
    def size(self):  # 查看站内元素数,有返回值
        return len(self.items)

# 利用栈判断括号闭合情况
def symbolChecker(symbolString):
    s = Stack()  # 首先建立一个空栈
    balanced = True  # 假设栈括号是对应的。
    index = 0  # 利用索引
    
    while index < len(symbolString) and balanced:
        symbol = symbolString[index]
        if symbol in '({[':  # 入栈判断
            s.push(symbol)
        else:
            if s.isEmpty():  # 判断栈是否为空,在此处的括号,让我纠结了一小时,为什么没判断正确。
                balanced = False
            else:
                top = s.pop()
                if not matches(top, symbol):
                    balanced = False
        index += 1
                
    if balanced and s.isEmpty():
        return True
    else:
        return False
    
def matches(open, close):  # 栈顶的括号,需要和新出现的括号配对,才能证明其正确性。此处利用位置匹配
    opens = '([{'  # 位置对应
    closers = ')]}'  # 位置对应
    return opens.index(open) == closers.index(close)
    
    
print(symbolChecker('({{}})'))

# 查错办法:1.在有输出结果处打印变量,检查哪里的分支没有进入。检查未进入原因,修改代码!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档