python算法

Leetcode题Tree:94/95/96/98/102/113/114/116/117/129/199/236,Python多种解法(十七)

心已入冬 提交于 2019-12-02 11:04:49
文章目录 前文 94. Binary Tree Inorder Traversal 95. Unique Binary Search Trees II 96. Unique Binary Search Trees Validate Binary Search Tree 102. Binary Tree Level Order Traversal 103. Binary Tree Zigzag Level Order Traversal 105. Construct Binary Tree from Preorder and Inorder Traversal 116. Populating Next Right Pointers in Each Node 129. Sum Root to Leaf Numbers 199. Binary Tree Right Side View 236. Lowest Common Ancestor of a Binary Tree 总结 前文   继上篇Leetcode题 Leetcode题Stack ,我们开始分享Tree系列的题,照旧是前300的题,并且重复系列的跳过。 94. Binary Tree Inorder Traversal # Definition for a binary tree node. class TreeNode:

Python数据结构最小生成树

守給你的承諾、 提交于 2019-12-02 10:50:46
前言   最近收到电力类专业同学的求助,希望能用一个算法使得从变电站至所有负载的总路线最短。当然,如果要添加特殊要求,你可以练习我的邮箱707101557@qq.com。其实应用最小生成树能够很好的解决这类问题。即给定一幅加权无向图,找到它的一颗最小生成树。此类算法主要应用是电路元器件的设计,航空航线规划,电站电力分配,图像分析等领域。 最小生成树   图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值(图中所有边的权值之和)最小的生成树。 最小生成树的经典算法   找最小生成树的两种经典算法分别是Prim算法和Kruskal算法。   Prim算法每一步都会为一棵生长中的树加一条边。一开始这看树只有一个顶点,然后会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。   笔者只是编写了该算法Python版本,读者可以通过 VisuAlgo 查看该算法的动态演示过程。 Python实现 #file @mst.py #date @2019/10/26 #Program to find the Minimum Spanning Tree using Prim's Algorithm and Heap Data Structure Maxint = 2 ** 31 - 1 #Implementation

希尔排序(C++ & Python)

余生长醉 提交于 2019-12-02 06:48:07
希尔排序 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。 下面以数列{80,30,60,40,20,10,50,70}为例,演示它的希尔排序过程。 第1趟:(gap=4) 当gap=4时,意味着将数列分为4个组: {80,20},{30,10},{60,50},{40,70}。 对应数列: {80,30,60,40,20,10,50,70} 对这4个组分别进行排序,排序结果: {20,80},{10,30},{50,60},{40,70}。 对应数列: {20,10,50,40,80,30,60,70} 第2趟:(gap=2) 当gap=2时,意味着将数列分为2个组:{20,50,80,60}, {10,40,30,70}。 对应数列: {20,10,50,40,80,30,60,70} 注意:{20,50

python实现敏感词过滤的几种方法

China☆狼群 提交于 2019-12-02 06:45:32
1.replace过滤 最简单也是最直接的就是直接循环敏感词,然后使用replace过滤关键词,文章和敏感词少的时候还可以,多的时候效率就真的很一般了。 2.使用正则过滤 有两个技术要点, 1.使用Python正则表达式的re的sub()函数; 2.在正则表达式语法中,竖线“|”表示二选一或多选一。 代码参考 import re def check_filter(keywords, text): return re.sub("|".join(keywords), "***", text) keywords = ("暴力", "色情", "其他关键字") text = "这句话里不包含暴力,也不包含色情,但是可能包含其他关键字" print(check_filter(keywords, text)) 返回结果 这句话里不包含***,也不包含***,但是可能包含*** 3.DFA过滤敏感词算法 在网上查了下敏感词过滤方案,找到了一种名为DFA的算法,即Deterministic Finite Automaton算法,翻译成中文就是确定有穷自动机算法。它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测,所以效率比方案一高不少。 假设我们有以下5个敏感词需要检测:傻逼、傻子、傻大个、坏蛋、坏人。那么我们可以先把敏感词中有相同前缀的词组合成一个树形结构

数据结构与算法(Python)—— (三)数据结构的概念

别来无恙 提交于 2019-12-02 06:43:30
有这样一个需求:用Python中的类型来保存一个班的学生信息,之后快速的通过学生姓名获取其详细信息。我们如何实现呢? 实际上当我们在思考这个问题的时候,我们已经用到了数据结构。列表和字典都可以存储一个班的学生信息,但是想要在列表中获取一名同学的信息时,就要遍历这个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历便可快速获取到学生信息,其时间复杂度为O(1)。 我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。在上面的问题中我们可以选择Python中的列表或字典来存储学生信息。列表和字典就是Python内建帮我们封装好的两种数据结构。 1. 概念 数据 是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。 数据结构指数据对象中数据元素之间的关系。 Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式

GitHub热门项目:使用Python实现所有算法!

情到浓时终转凉″ 提交于 2019-12-02 05:55:19
学会了Python基础知识,想进阶一下,那就来点算法吧!毕竟编程语言只是工具,结构算法才是灵魂。 新手如何入门Python算法? 几位印度小哥在GitHub上建了一个各种Python算法的新手入门大全。从原理到代码,全都给你交代清楚了。为了让新手更加直观的理解,有的部分还配了动图。 给出Github地址☟ https://github.com/TheAlgorithms/Python 这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各种算法的代码实现。 算法的代码实现 算法的代码实现给的资料也比较丰富,除了算法基础原理部分的Python代码,还有包括神经网络、机器学习、数学等等代码实现。 例如在神经网络部分,给出了BP神经网络、卷积神经网络、全卷积神经网络以及感知机等。 代码以Python文件格式保存在Github上,需要的同学可以自行保存下载。 再次给出github地址: https://github.com/TheAlgorithms/Python 算法原理 在算法原理部分主要介绍了排序算法、搜索算法、插值算法、跳跃搜索算法、快速选择算法、禁忌搜索算法、加密算法等。 当然,除了文字解释之外,还给出了帮助更好理解算法的相应资源链接,包括维基百科、动画交互网站链接。 例如,在一些算法部分中,其给出的动画交互链接,非常完美帮助理解算法的运行机制。 交互动画地址:

手把手教你吧Python应用到实际开发 不再空谈悟法✍✍✍

◇◆丶佛笑我妖孽 提交于 2019-12-02 05:49:13
手把手教你吧Python应用到实际开发 不再空谈悟法 想用 python做机器学习吗,是不是在为从哪开始挠头? 这里我假定你是新手,这篇文章里咱们一起用 Python完成第一个机器学习项目。 我会手把手教你以下内容: 下载 python,numpy,SciPy之类软件并安装,这些是python里机器学习方面最有用的软件包。 加载一个数据集,通过统计摘要( statistical summaries)和数据可视化来了解数据集的结构。 创建 6个机器学习模型,选择这里边最好的,然后介绍通过何种方法来确定选出来的模型预测时有稳定的准确率。 如果你是机器学习的初学者,并且你下定决心用 python作为开始机器学习的语言的话,这篇文章应该会比较适合你。 刚开始的时候, Python看起来有点吓人 Python是一种很流行,很强大的解释型语言。跟R不一样,对于研究,开发以及完成生产系统来说,python是一个完整的开发语言,一个完整的平台。 Python中也有许多可供选择的模块和库,对于上面说的研究,开发和完成生产系统提供了多种实现的路径。给人的感觉是python的前景势不可挡。 再次重申,用 Python学习机器学习的最好方法是完成一个完整的项目。 这样做强制你安装 Python,并且启动python的解释器(最少会这样)。 这样做能给你一个整体审视的机会,体验如何一步步完成一个小项目。

python新手必躺的5大坑

一笑奈何 提交于 2019-12-02 05:15:33
python新手必躺的5大坑 对于Python新手来说,写代码很少考虑代码的效率和简洁性,因此容易造成代码冗长、执行慢,这些都是需要改进的地方。本文是想通过几个案列给新手一点启发,怎样写python代码更优雅。 新人躺坑之一:不喜欢使用高级数据结构 sets(集合) 很多新手忽视sets(集合)和tuple(元组)的强大之处 例如,取两个列表交集: def common_elements(list1, list2): common = [] for item1 in list1: if item1 in list2: common.append( item1 ) 、 return common 这样写会更好: def common_elements(list1, list2): common = set(list1).intersection(set(list2)) return list(common) dic(字典) 新手枚举(访问和取出)字典的键和对应值,认为对应值必须通过键来访问,往往会这样做: my_dict = {'a':1,'b':2} for key in my_dict: print(key, my_dict[key]) 有一个更优雅的方法可以实现: my_dict = {'a':1,'b':2} for key, value in my_dict.items()

Python链表操作(实现)

爷,独闯天下 提交于 2019-12-02 05:15:01
Python链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题。链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一。在本文中,我将针对链表本身的数据结构特点,以及链表的一些常见操作给大家做一个深入浅出的讲解,希望本文的读者能够掌握链表的操作。 1. 什么是链表? 简单地说,链表是一种无序的列表。你可以把链表里面的数据看成是随机排列的,元素之间并没有固定的先后顺序。所以,既然是无序的,那么我们就无法像操作list对象一样简单地用index来去定位和操作里面的元素,如下图所示: 图1 那么针对这种情况,我们怎么才能找到里面的各个元素呢? 其实,在链表里面的每个元素其实是一种叫Node的节点对象,每个Node会保存两个信息,一个是这个节点的值value,另一个是这个节点对应的下一个节点的引用next。这样,节点与节点之间其实就形成了一种链式结构,就像一根铁链一样,一环扣一环,这也是链表这个名字的由来。有了这样的链式结构,只要给我们一个起点,我们就能沿着起点一个节点一个节点地找到所有的节点,这就是链表整个数据结构的核心。 2. 如何实现链表? 前面已经讲过,链表结构的关键是Node节点对象,所以要实现链表之前,我们需要先定义Node节点对象。每个节点中保存着当前节点的数据value,以及当前节点的下一个节点的引用next

Python面试常考点之深入浅出链表操作

ぐ巨炮叔叔 提交于 2019-12-02 05:14:02
Python面试常考点之深入浅出链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题。链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一。在本文中,我将针对链表本身的数据结构特点,以及链表的一些常见操作给大家做一个深入浅出的讲解,希望本文的读者能够掌握链表的操作。 1. 什么是链表? 简单地说,链表是一种无序的列表。你可以把链表里面的数据看成是随机排列的,元素之间并没有固定的先后顺序。所以,既然是无序的,那么我们就无法像操作list对象一样简单地用index来去定位和操作里面的元素,如下图所示: 图1 那么针对这种情况,我们怎么才能找到里面的各个元素呢? 其实,在链表里面的每个元素其实是一种叫Node的节点对象,每个Node会保存两个信息,一个是这个节点的值value,另一个是这个节点对应的下一个节点的引用next。这样,节点与节点之间其实就形成了一种链式结构,就像一根铁链一样,一环扣一环,这也是链表这个名字的由来。有了这样的链式结构,只要给我们一个起点,我们就能沿着起点一个节点一个节点地找到所有的节点,这就是链表整个数据结构的核心。 2. 如何实现链表? 前面已经讲过,链表结构的关键是Node节点对象,所以要实现链表之前,我们需要先定义Node节点对象。每个节点中保存着当前节点的数据value,以及当前节点的下一个节点的引用next