![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法基础
文章平均质量分 52
python编写数据结构和算法基础
林坤鹏kplin
不积跬步,无以至千里;不积小流,无以成江海。
展开
-
质数相关算法:质数相关数学知识和常见题目求解
质数求解常用的数学相关知识:一、什么是质数?什么是合数?什么是质因子(自己百度)1、质数也叫素数,只能被1和自己整除,例如 2和3。2、整数1不是质数。3、合数除了能被1和自己整除之外,还能被其他小于自己的整数整除,例如:4 =2*2。4、对于一个整数n,可以分解为2个以上的整数相乘,分解出来的整数称为n的因子,其中为质数的,称为质数因子,也叫质因子,合数的称为合数因子。二、因式分解的常识对整数number进行因式分解时,如果我们分解出一个小于根号number的因子,必然会有一个大于根号num原创 2022-02-17 17:44:33 · 644 阅读 · 0 评论 -
质数相关算法:求整数n的所有质因子
题目描述功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )最后一个数后面也要有空格数据范围: 1≤n≤2×10**9+14输入描述:输入一个long型整数输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。示例1输入:180输出:2 2 3 3 5整数质因子的核心判断:1、能被该整数整除;2、是质数(素数)思路一:1、先找出该整数下的所有质数,再逐一判断是否能被该整数整除,原创 2022-02-17 17:37:03 · 4301 阅读 · 0 评论 -
质数相关算法:统计小于整数n的质数个数
问题:现给定一个大于1的整数 N,求出小于N 的质数的个数。例如:输入 10输出:4(2,3,5,7)输入:20输出: 8(2,3,5,7,11,13,17,19)以下介绍5种算法,前3种思路一致,主要是效率的差异;第5种采用了埃拉托斯特尼筛法进行计算(比较巧妙)算法1:针对小于N的每个正整数x,我们可以遍历从2到x-1遍历去试除,当出现一个数能被整除,那这个数就不是质数;当然这种方法也是最容易想到的方法,但效率也是最低的方法;代码如下:def prime(n): m = 0原创 2022-02-17 17:31:22 · 1013 阅读 · 0 评论 -
质数相关算法:判断是否为质数的方法
1、试除法:根据定义循环判断该数除以比他小的每个自然数(大于1),如果有能被他整除的就不是质数。缺点:如果只用试除法,时间复杂度较大,为n# 判断一个数是不是素数# 算法1:时间复杂度较大,为ndef is_prime1(num): '''循环遍历小于该数的所有整数,除了1和它本身之外,如果有其他数能被它整除,它就不是质数''' if num <= 1: return False for i in range(2, num): if n原创 2022-02-17 17:19:05 · 1009 阅读 · 0 评论 -
7.2、堆排序的代码分析(算法基础—排序算法)
上一篇:7.1、堆排序的逻辑分析(算法基础—排序算法)经过上一篇逻辑分析,我们已经知道了堆排序的核心就是解决2个问题:1、堆的一次向下调整2、构建堆但是如果我们仔细看下图,会发现,其实构建堆的过程,就是多次完成“堆的一次向下调整”,只不过这个过程中,要按什么顺序去先后调整各个子树,是个需要考虑的问题。一、构造堆应该以什么顺序去调整子树我们直接看每一步需要调整的子树的根节点:第一步的根节点:3第二步的根节点:14第三步的根节点:13第四步的根节点:9第五步的根节点:5上面这个树结构原创 2021-11-06 00:16:09 · 475 阅读 · 2 评论 -
7.1、堆排序的逻辑分析(算法基础—排序算法)
堆是一个特殊的二叉树,所以学习堆排序之前,必须先了解一些关于树的基础知识:一、堆排序基础知识(树)树是一种数据结构,就像一棵倒置的树。计算机中的文件目录就类似于树结构,一个文件夹里面可以有多个文件夹,每个文件夹分下去又可以有多个文件夹。树的根:上图的A就是树的根节点,每棵树只有一个根节点;树的节点:图中的A到Q都是树的节点;树的叶子节点:每个分支延伸到末端的都是树的叶子节点,例如图中的B、C、H、I、K、L、M、N、P、Q树的深度(高度):从根节点到叶子节点最长的路径,该路径上节点的总数就是树原创 2021-11-02 23:25:08 · 464 阅读 · 0 评论 -
6、排序Low-B三人组之插入排序(算法基础—排序算法)
1、插入排序逻辑类比插入排序的过程可以类比为:打扑克牌时摸完牌后按大小插入到手里的牌这个过程。最初有一堆无序的牌1、先从这堆无序的牌中,抽出一张,放到手里;2、再从无序牌中摸出一张(从无序列表的第二位开始遍历,按顺序取出元素),用个变量tmp存起来,然后拿手里的牌跟tmp做对比;3、拿手里牌的右边第一张牌(最大的牌)跟tmp对比,如果比tmp大的,就让右边第一张牌往前移动1位,继续拿手里牌右边第二张牌对比;4、如果没有的找到比tmp大的或者手里的牌都对比完了,就让tmp插入到这个位置2、图文解原创 2021-10-25 02:39:38 · 264 阅读 · 0 评论 -
5、排序Low-B三人组之选择排序(算法基础—排序算法)
选择排序逻辑:一趟排序记录最小的数,放到第一个位置再一趟排序记录记录列表无序区最小的数,放到第二个位置;算法关键点:有序区和无序区、无序区最小数的位置为什么叫选择排序因为这个过程中,我们是不断选出无序区的最小值,所以叫选择排序。选择排序写法1(较差的写法)逻辑:先创建一个新的空列表,每次从待排序的列表中拿出最小值,追加到新列表中,最后得到的新列表就是排好序的列表了。def select_sort_simple(li): new_li = [] for i in range(l原创 2021-10-24 23:34:04 · 2155 阅读 · 0 评论 -
4、排序Low-B三人组之冒泡排序(算法基础—排序算法)
冒泡排序逻辑:1、对于一个无序的列表,可以不断遍历它,对比相邻的2个数,如果左边的数比右边大,则交换2个数的位置,多次遍历后,小的数会不断被交换到前面,大的数会不断交换到后面,最后完成排序。2、假设列表有n个数字,最多也就是遍历n-1次,因为就算最小值排在第最后一位,它最多也只需要移动n-1次,就能排在第1位。为什么称为冒泡排序每一次遍历列表后,最大的数字都会被顶到最后面。如果我们把这个列表竖着放,这个过程看起来就是大的数字不断往上冒起来,所以称为冒泡排序。过程详解如下图所示:第1次遍历结果原创 2021-10-24 22:37:40 · 2076 阅读 · 0 评论 -
3、二分查找算法的3种写法(算法基础—查找算法)
二分查找:又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。第一种简单写法:逻辑:通过取中间位置的值来对比,不断调整候选区的范围,匹配到则范围该直到如果最后匹配成功。由于left和right的值一直跟随mid一同变化,所以最后得到的mid值,是真正的位置def binary_search2(li, val): '''假设输入的是个升序的列表,获取中间位置的值跟要查找的值val作对比, 如果比val大,则取中间位置左边原创 2021-10-24 02:11:48 · 316 阅读 · 0 评论 -
2、顺序查找算法(算法基础—查找算法)
顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。其实也就是遍历,很简单,没什么特别的,直接上代码,2种写法:写法1:def linear_search(li, val): for idx, v in enumerate(li): # 枚举函数,传入一个可迭代对象,返回依次迭代的下标和值,默认从0开始 if v == val: return idx returnli = ['1', '2原创 2021-10-24 01:50:43 · 395 阅读 · 0 评论 -
2、双向链表的实现(数据结构py)
双向链表一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。代码实现:#!/usr/bin/env python# -*- coding:utf-8 -*-# date: 2021/10/13# filename: 2、双链表# author: kplinclass Node(object): """双向链表节点""" def __init__(原创 2021-10-21 01:02:28 · 139 阅读 · 0 评论 -
1、单链表的实现(数据结构py)
1、链表的定义链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。2、单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。(1)表元素域elem用来存放具体的数据。(2)链接域next用来存放下一个节点的位置(python中的标识)(3)变量p指向链表原创 2021-10-21 00:33:02 · 194 阅读 · 0 评论 -
1、递归算法解决汉诺塔问题(算法基础)
1、递归算法的特点1、调用本身2、设置一个结束条件需要先将问题简单化,找到一个可以不断递推下去的规律2、问题背景:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。3、问题:如何模拟这原创 2021-10-20 23:54:06 · 2808 阅读 · 0 评论 -
一个解析多重括号嵌套问题的简单算法
一、问题背景:最近在研究如何从复杂的SQL中解析来源表的问题,扩展到后面研究如何解析SQL的来源字段和字段别名问题,这两个问题都有一个核心问题要解决。以下面的解析来源字段和字段别名为例,无论用什么解析方法,最后都需要按逗号去分割字段,而在这里面,因为有子查询和函数,里面也会有逗号,所以最后会干扰到逗号分割的准确性。但是可以先用一个方法,把括号中的内容都整体识别出来,先用一些没有逗号的特定符号替换掉,再按逗号切割就可以避免这个问题了,最后再根据前面的替换规则,还原括号的内容即可。但这个按括号识别的过原创 2021-07-10 12:25:48 · 2022 阅读 · 1 评论