<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_70372647的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/m0_70372647</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; m0_70372647]]></copyright><item><title><![CDATA[【python算法系列十三】素性检验算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/125009733</link><guid>https://blog.csdn.net/m0_70372647/article/details/125009733</guid><author>m0_70372647</author><pubDate>Fri, 27 May 2022 19:49:37 +0800</pubDate><description><![CDATA[你能很迅速地找出两个比 1000 大的素数吗？你能很迅速地分辨 754729 是哪两个素数的乘积吗？实际上，因为素数相对密集，所以我们可以相对迅速地找出两个大的素数。但是，现在还没有已知算法能够有效地分解乘机中的因子。因此，在现代密码学中，利用这个时间差距，计算机科学家们发明了安全的加密系统，如 RSA 与 Rabin。

简单来说，加密信息的人需要随机地找出两个素数并且公开它们的乘积，如果他人想要破解信息的话必须分解被公开的乘积。这样，只要加密的人找到两个足够大的素数，第三方就没有方法破解信息。

但是，]]></description><category></category></item><item><title><![CDATA[【python算法系列十二】平衡二叉树（AVL树）]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124993502</link><guid>https://blog.csdn.net/m0_70372647/article/details/124993502</guid><author>m0_70372647</author><pubDate>Thu, 26 May 2022 22:49:39 +0800</pubDate><description><![CDATA[平衡二叉树是一种特别形式的二叉搜索树，它采用平衡化旋转来避免二叉搜索树出现退化的情况。



二叉搜索树的效率

理论上来说，对二叉搜索树进行一次操作的时间复杂度是 O(lgn)，这是因为二叉搜索树在理想状态下是近似于完全二叉树的。但是，在实际操作中，二叉搜索树很容易退化成线性的数据结构。例如，往二叉搜索树中插入一个有序序列，这时会得到一条链，如图 1 所示。



图 1：二叉搜索树退化成线性



这时候，对二叉搜索树进行操作的平均时间复杂度就会退化成 O(n)。左右子树的大小相差巨大的二叉搜索树，就.]]></description><category></category></item><item><title><![CDATA[【Python算法系列十一】二叉树的3种遍历方式]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124989895</link><guid>https://blog.csdn.net/m0_70372647/article/details/124989895</guid><author>m0_70372647</author><pubDate>Thu, 26 May 2022 18:28:22 +0800</pubDate><description><![CDATA[二叉树的遍历是指从根结点出发，按照某种次序依次访问二叉树中所有结点，使得每个结点被访问一次且仅被访问一次。



遍历二叉树的方法主要分 3 种：先序遍历、中序遍历和后序遍历：

先序遍历指最先遍历节点本身，再遍历节点的左子树，最后遍历右子树的遍历方法；
	中序遍历指最先遍历节点的左子树，再遍历节点本身，最后遍历右子树的遍历方法；
	后序遍历指最先遍历节点的左子树，再遍历右子树，最后遍历节点本身的一种遍历方法。


在图 1 中，L 是左子树，R 是右子树，D 当前节点。如果用这三个字母来表示 3 种遍历.]]></description><category></category></item><item><title><![CDATA[pandas重复值的处理]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124975398</link><guid>https://blog.csdn.net/m0_70372647/article/details/124975398</guid><author>m0_70372647</author><pubDate>Wed, 25 May 2022 22:55:14 +0800</pubDate><description><![CDATA[在数据分析前，首先要进行数据采集。通常，采集到的原始数据大多数是不完整和不一致的“脏”数据，无法直接进行数据挖掘。为了提高数据挖掘的质量，产生了数据预处理技术。数据预处理包括数据清理、数据集成、数据变换、数据归约等。

数据清洗是发现并纠正数据文件中可识别的错误，如移除重复数据，处理缺失值和空格值，检测和过滤异常值，并检查数据一致性等。通过数据清洗不仅要使通过清洗后的数据变得可用，而且还要使数据变得更加适合进行后续的数据分析工作。那就介绍下数据重复值的处理。



原始数据集中往往会存在着许多重复数据。所谓]]></description><category></category></item><item><title><![CDATA[PyQt三个窗口基类（QMainWindow、QWidget、QDialog）]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124973827</link><guid>https://blog.csdn.net/m0_70372647/article/details/124973827</guid><author>m0_70372647</author><pubDate>Wed, 25 May 2022 21:06:16 +0800</pubDate><description><![CDATA[1.QMainWindow类

QMainWindow 类提供一个主应用程序窗口。QMainWindow 类经常被继承，使得封装中央部件、菜单、工具条、状态栏等变得很容易。



QMainWindow类中比较重要的方法如下：

addToolBar（）：添加工具栏；
	centralWidget（）：返回窗口中心的一个控件，未设置时返回NULL；
	menuBar（）：返回主窗口的菜单栏；
	setCentralWidget（）：设置窗口中心的控件；
	setStatusBar（）：设置状态栏；
	sta]]></description><category></category></item><item><title><![CDATA[Python列表和元组的相互转换（实例）]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124973649</link><guid>https://blog.csdn.net/m0_70372647/article/details/124973649</guid><author>m0_70372647</author><pubDate>Wed, 25 May 2022 20:52:55 +0800</pubDate><description><![CDATA[元素和列表都是一种数据类型，在面向对象编程里，都有构造函数的概念。构造函数里的参数可以接纳元组或列表。所以，分别用 tuple（元组名）或 list（列表名）来实现即可。



【参考代码】


In [6]: a_list = [1, 2, 3, 4]             #创建一个列表
In [7]: a_tuple = ('a', 'b', 'c', 'd')    #创建一个元组
In [8]: tuple_a_list = tuple(a_list)      #将列表转换成元组
In [9]]]></description><category></category></item><item><title><![CDATA[满二叉树和完全二叉树的区别]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124973251</link><guid>https://blog.csdn.net/m0_70372647/article/details/124973251</guid><author>m0_70372647</author><pubDate>Wed, 25 May 2022 20:37:12 +0800</pubDate><description><![CDATA[二叉树分类很多，其中有满二叉树和完全二叉树，这两种二叉树的效率都很高，但它们之间也有不同，那它们之间的区别是什么呢？

满二叉树

顾名思义，满二叉树指每一层都达到了最大节点数的二叉树，也就是深为 k 且有 2k-1 个节点的二叉树。它可以按从左到右、从上到下的顺序编号，如图 1 所示。



图 1：满二叉树



完全二叉树

在深度为 k 的完全二叉树中，所有的节点也按从左到右、从上到下的顺序编号。每个节点的编号都与深度为 k 的满二叉树中相应位置的节点一一对应。图 2 所示为完全二叉树。



图 ]]></description><category></category></item><item><title><![CDATA[python 二叉树详解]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124971602</link><guid>https://blog.csdn.net/m0_70372647/article/details/124971602</guid><author>m0_70372647</author><pubDate>Wed, 25 May 2022 18:51:35 +0800</pubDate><description><![CDATA[二叉树是一种特殊的树，最直观地体现于它的每个节点至多有两个子节点。二叉树是非常实用的一种数据结构，常常用于实现二叉查找树及二叉堆等，使得数据的存储和搜索效率大大提高。

每个二叉树的节点至多有两棵子树，它们又分为左子树和右子树。根据这种特性，可以把二叉树的形态分为 5 种，如图 1 所示。



图 1：不同的二叉树



二叉树的性质

了解了二叉树的主要性质后，对建立和使用二叉树以及求解相关题目都十分有用。下面就介绍二叉树的几条主要性质以及它们的证明。

1) 在二叉树的第 i 层上至多有 2i-1 个]]></description><category></category></item><item><title><![CDATA[算法中“树”的基本概念 （图）]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124955420</link><guid>https://blog.csdn.net/m0_70372647/article/details/124955420</guid><author>m0_70372647</author><pubDate>Tue, 24 May 2022 21:51:17 +0800</pubDate><description><![CDATA[在学习树中的查找方法之前，首先要了解“树”这种数据结构。树是一种由 n 个元素组成的集合，元素间具有层次关系。如图 1 所示，这种数据结构叫作“树”，是因为它就像一棵倒过来的树，茂密的叶子在下面，而根在最上面。





当 n=0 时，树被称作空树。当 n&gt;0 时，树被称作非空树。

对于非空树，最基本的概念有三个：

树中的每个元素被称为节点；
	树最顶层的节点称作根节点；比当前节点深度小但与当前节点之间相连的节点称为节点的前驱；每棵树只有一个特定的根节点，它没有直接前驱；
	当 n&gt;1 时]]></description><category></category></item><item><title><![CDATA[【Python算法系列十】二分查找算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124936085</link><guid>https://blog.csdn.net/m0_70372647/article/details/124936085</guid><author>m0_70372647</author><pubDate>Tue, 24 May 2022 19:34:43 +0800</pubDate><description><![CDATA[二分查找，也叫折半查找，是一种适用于顺序存储结构的查找方法。它是一种效率较高的查找方法，时间复杂度为 O(lgn)，但它仅能用于有序表中。也就是说，表中的元素需按关键字大小有序排列。
二分查找用左右两个指针来标注查找范围。程序开始时，查找范围是整个线性表，左指针指向第一个元素，右指针指向最后一个元素；每一次循环过后，查找范围都缩小为原先的一半，直到左右指针重叠或者左指针处于右指针的右侧。因为每次缩小一半的范围，所以可以得出二分查找的时间复杂度为 O(lgn)。

...]]></description><category></category></item><item><title><![CDATA[【Python算法系列九】 顺序查找算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124931956</link><guid>https://blog.csdn.net/m0_70372647/article/details/124931956</guid><author>m0_70372647</author><pubDate>Mon, 23 May 2022 18:50:34 +0800</pubDate><description><![CDATA[定义

查找的定义为：在一个数据元素集合中，通过一定的方法确定与给定关键字相同的数据元素是否存在于集合中。一般来说，如果查找成功，程序会返回数据的位置或相关信息；如果查找失败，则返回相应的提示。

查找的方法可以分为两种：比较查找法与计算式查找法。
比较查找法基于两种数据结构：线性表和树。
查找的对象（一般是由同一类型的数据元素/记录构成的集合）又可以被称为查找表。
查找还分为静态查找和动态查找。
对查找表进行静态查找时，程序只进行查找并返回信息；
进行动态查找时，在静态查找的基础上，还增加了增删查找表中.]]></description><category></category></item><item><title><![CDATA[【python算法系列八】归并排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124908304</link><guid>https://blog.csdn.net/m0_70372647/article/details/124908304</guid><author>m0_70372647</author><pubDate>Sun, 22 May 2022 17:30:00 +0800</pubDate><description><![CDATA[相比起初级排序算法，高级排序算法往往有更加复杂的逻辑，但也会有更高的时间或空间效率。其中有些高级排序算法是由初级排序算法优化而来的。在处理大量数据时，高级排序算法的一般更加常用。

本节教程介绍的第一种高级排序算法是归并排序。“归并”一词，意为“合并”。顾名思义，归并排序算法就是一个先把数列拆分为子数列，对子数列进行排序后，再把有序的子数列合并为完整的有序数列的算法。它实际上采用了分治的思想，之后我们会深度讲解分治思想。


归并排序的平均时间复杂度是 O(nlgn)，最好情况下的时间复杂度是 O(nlg.]]></description><category></category></item><item><title><![CDATA[【python算法系列七】插入排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124907803</link><guid>https://blog.csdn.net/m0_70372647/article/details/124907803</guid><author>m0_70372647</author><pubDate>Sun, 22 May 2022 10:42:37 +0800</pubDate><description><![CDATA[排序通常指把毫无规律的数据，按照一种特定的规律，整理成有序排列的状态。一般情况下，排序算法按照关键字的大小，以从小到大或从大到小的顺序将数据排列。

排序算法是最基础也是最重要的算法之一，在处理大量数据时，使用一个优秀的排序算法可以节省大量时间和空间。因为不同的排序算法拥有不同的特点，所以我们应根据情况选择合适的排序算法。

初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序 3 种。虽然它们的效率相对于高级排序算法偏低，但是在了解初级排序算法之后，再去学习相对复]]></description><category></category></item><item><title><![CDATA[【python算法系列六】选择排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124897318</link><guid>https://blog.csdn.net/m0_70372647/article/details/124897318</guid><author>m0_70372647</author><pubDate>Sat, 21 May 2022 13:43:31 +0800</pubDate><description><![CDATA[选择排序表示从无序的数组中，每次选择最小或最大的数据，从无序数组中放到有序数组的末尾，以达到排序的效果。选择排序的平均时间复杂度是O(n2)，最好情况下的时间复杂度和最坏情况下的时间复杂度都是 O(n2)。另外，它是一个不稳定的排序算法。
选择排序的过程如下;
1) 如图 1 所示，我们仍以递增排序的算法为例，先遍历未排序的数组，找到最小的元素。然后，把最小的元素从未排序的数组中删除，添加到有序数组的末尾。因为最小的元素是 1，所以 1 被添加到仍为空的有序数组末尾。


图 1：选择并放置第一个元素


]]></description><category></category></item><item><title><![CDATA[Logistic回归分类算法详解]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124871586</link><guid>https://blog.csdn.net/m0_70372647/article/details/124871586</guid><author>m0_70372647</author><pubDate>Thu, 19 May 2022 21:04:37 +0800</pubDate><description><![CDATA[我们来讨论另外一种被广泛应用的分类算法— Logistic 回归。在讲解这个概念之前，我们先来聊一个题外话—“Logistic regression”的中文译法。“regression”译作“回归”，并没有什么异议，而“Logistic”的翻译可谓五花八门。有译作“逻辑斯谛”的，这种音译中规中矩，自然不能算错，但不够形象。
更多文献直接将其译作“逻辑”，这种译法可能就有点误导大家了。“逻辑”（logic）本来是一个哲学概念，它注重的是推论和证明，而“Logistic”主要用于机器学习领域的分类。二者几乎无关]]></description><category></category></item><item><title><![CDATA[Numpy.random模块生成随机数]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124871168</link><guid>https://blog.csdn.net/m0_70372647/article/details/124871168</guid><author>m0_70372647</author><pubDate>Thu, 19 May 2022 20:48:30 +0800</pubDate><description><![CDATA[在数据分析中，随机数不仅有利于数据分析，而且在机器学习方面随机数的使用也是机器学习算法配置和评估的重要部分。例如，神经网络中的权重的随机初始化和将数据分成随机的训练和测试集等。因此，生成随机数是数据分析中一项很重要的技术。
在 Python 中，可以通过 Python 中的 random 模块生成随机数，但是，其效率要远低于利用 NumPy 中的 random 模块生成随机数。numpy.random 模块提供了非常全的自动产生数据的 API，通过该模块中的函数可以很方便地生成随机数。下面介绍使用 nump]]></description><category></category></item><item><title><![CDATA[【python算法系列五】桶排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124871084</link><guid>https://blog.csdn.net/m0_70372647/article/details/124871084</guid><author>m0_70372647</author><pubDate>Thu, 19 May 2022 20:40:55 +0800</pubDate><description><![CDATA[由于桶排序算法把每个数都放到合适的“桶”里进行排序，因此而得名。桶排序的算法原理可以理解为创建一个新的数组，把数依次放入合适的桶内，再按一定顺序输出桶。
当每个桶的数据范围为 1 且数据皆为整数时，桶排序的时间复杂度在所有情况下都是 O(n)，因为它是一个线性的排序算法。但是，它的空间需求要视排序数据的范围而定，所以极有可能浪费很多空间。
假设我们有 10 个整数 [1,1,3,19,35,49,50,5,10,16]，它们的范围在 1～50。如图 1 所示，我们建立 50 个存放数据的桶。



图 1：]]></description><category></category></item><item><title><![CDATA[【python算法系列四】堆排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124870580</link><guid>https://blog.csdn.net/m0_70372647/article/details/124870580</guid><author>m0_70372647</author><pubDate>Thu, 19 May 2022 20:19:14 +0800</pubDate><description><![CDATA[堆排序，就像它的名字一样，利用了堆的特性来进行排序。实现堆排序的思路是，把数组构建成一棵二叉树，并随着每次堆的变化更新堆顶的最大/最小值。堆排序的时间复杂度在所有情况下都是 O(nlgn)，它也是一个不稳定的算法。在开始编写堆排序的程序之前，我们首先要了解“堆”的概念。
堆是一种数据结构，它是一种特殊的完全二叉树：如果这个堆是一个大顶堆（最大的元素在堆顶），那么每个节点上的元素都应该比它的子节点上的元素要大，最大的元素在根节点上；反之，如果是小顶堆，那么每个节点上的元素都应该比它的子节点小，最小的元素在根节]]></description><category></category></item><item><title><![CDATA[【python算法系列三】 希尔排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124808637</link><guid>https://blog.csdn.net/m0_70372647/article/details/124808637</guid><author>m0_70372647</author><pubDate>Mon, 16 May 2022 21:35:05 +0800</pubDate><description><![CDATA[希尔排序，又叫“缩小增量排序”，是对插入排序进行优化后产生的一种排序算法。它的执行思路是：把数组内的元素按下标增量分组，对每一组元素进行插入排序后，缩小增量并重复之前的步骤，直到增量到达 1。
一般来说，希尔排序的时间复杂度为 O(n1.3)～O(n2)，它视增量大小而定。希尔排序的空间复杂度是 O(1)，它是一个不稳定的排序算法。进行希尔排序时，元素一次移动可能跨越多个元素，从而可能抵消多次移动，提高了效率。
下面是使用（数组长度/2）作为初始增量的升序希尔排序，每一轮排序过后，增量都缩小一半。
1) 如]]></description><category></category></item><item><title><![CDATA[【python算法系列二】快速排序算法]]></title><link>https://blog.csdn.net/m0_70372647/article/details/124758205</link><guid>https://blog.csdn.net/m0_70372647/article/details/124758205</guid><author>m0_70372647</author><pubDate>Fri, 13 May 2022 19:45:24 +0800</pubDate><description><![CDATA[快速排序的思想是：取数组中的一个数作为基准值，把所有小于基准值的数都放在它的一侧，再把所有大于基准值的数都放在它的另一侧。随后，对基准值左右两侧的数组分别进行快速排序。由此可以看出，快速排序的整个排序过程也是递归进行的。


快速排序的平均时间复杂度是 O(nlgn)，最好情况下的时间复杂度是 O(nlgn)。最坏情况下，快速排序的时间复杂度可能退化成 O(n2)，但这种情况很少见。它的空间复杂度是 O(nlgn)。它是一个不稳定的排序算法。如果使用得当，快速排序的速度可以达到归并排序和堆排序的数倍，所以.]]></description><category></category></item></channel></rss>