自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 python函数调用关系分析

在Pycharm的专业版中,提供了一个分析项目性能的工具run->Profile,可以将工程运行时各函数的调用次数和所用时间记录下来,提供静态数据和关系图表两种表达方式。只需轻轻一点,统计数据和图表关系一览无遗,确实方便。但是此方法局限性很大,一是必须使用pycharm,这样使用其他ide如VS Code的用户就没法使用了;二是它不仅要使用pychram,还得是专业版,专业版是要收费的(破解和学生版除外),这又是一道坎挡在了我们的路上。那么有其他的方法来进行类似的分析吗?当然是有的。profi

2022-03-22 15:26:42 7737

原创 消失的cmp

简介cmp是compare的缩写,顾名思义,它的作用用于比较。在python2或C/C++等语言中,cmp函数允许自定义排序函数,即接收两个参数,根据两个参数的关系来决定返回-1(参数1排在参数2之前),0(相等),1(参数1排在参数2之后)三种数值。cmp常用于对列表进行客制化排序。python2中的cmp在python2中,sorted排序有三个参数sorted(iterable[,cmp,[,key[,reverse=True]]])默认情况下返回从小到大排序的列表。第一个参数是一个it

2022-03-22 15:24:38 500

原创 KMP解析

简介KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法),正是用它的三个发明者的名字缩写来命名的。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next数组实现,数组本身包含了模式串的局部匹配信息。KMP算法的时间复杂度为O(m+n)O(m+n)O(m+n).原理KMP算法的核心有以下几点:

2022-03-22 15:22:50 198

原创 Pytorch的网络可视化

概述有时候想要绘制一个神经网络的网络结构,可以通过代码中层的定义去用第三方软件依次绘制,但是这样费时费力。因此需要一种快速绘制的办法。Netronnetron可通过所保存的模型将其用网络的方式可视化出来,但是对于pytorch来说,其支持程度还不够,无法绘制各参数间的关系,可以将pytorch模型导出为onnx格式再使用netron来可视化。# 自建一个CNN模型并导出为onnx来可视化import torchimport torch.nn as nnclass CNNModel(nn.M

2022-03-22 15:21:03 2988

原创 位运算之美

简介计算机底层用的是机器码,即0和1交织而成。位运算在某些情况下,有着神奇的功效,能够提升效率,节省空间。此文对位运算的经典操作进行一些总结。例如:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]可以采

2022-03-22 15:15:21 90

原创 卡特兰数,栈的特殊运用

简介卡特兰数是一个在组合数学里经常出现的一个数列,对卡特兰数来说,难以抽象出一个具体的意义预知对应,但它却是一个十分常见的数学规律,符合多种问题规律求解。从零开始,卡特兰数的前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…递推公式基础公式:Cn+1=C0Cn+C1Cn−1+...+Cn−1C1+CnC0C0=C1=1C_{n+1}=C_0C_n+C_1

2022-03-22 15:12:49 354

原创 树状数组,了解三点就够了

简介何为树状数组?首先引用百度百科的定义:树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为Fenwick树,最早由Peter M. Fenwick于1994年以A New Data Structure for Cumulative Frequency Tables为题发表在SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和, 区间和。

2022-03-22 15:09:46 370

原创 排序算法——希尔排序

介绍从头实现希尔排序。希尔排序(Shell Sort)按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。是一种插入排序的改进方式。插入排序在排序的时候,需要逐一比较两两元素之间的大小,效率不高。希尔排序按照下标的增量将序列先分组,每个组里使用插入排序,这样可以跳跃地比较元素的大小,确定元素间的宏观位置。再经过慢慢缩减增量(有不同增量选取方式,通常取原增量的二分之一),可以微调元素位置,直到增量达到1时,所有元素排序完成。看起来希尔排序的步骤要比插入排序的多很多,那它

2021-08-28 15:46:03 186

原创 排序算法——选择排序

简介从头实现选择排序。选择排序(Selection sort)不断从乱序数列(后半部分)中选择最小(最大)值放入有序数列(前半部分)中,无论数据初始排列如何,其时间复杂度恒为O(n2)O(n^2)O(n2).好处是不占额外的空间复杂度。示例public class SelectionSort { public static void main(String[] args) { int[] arr = {57, 65, 54, 30, 45, 7, 6, 26, 35, 96

2021-08-28 15:45:58 96

原创 排序算法——桶排序

介绍从头实现桶排序。桶排序(Bucket sort)是将待排序集合中处于同一个值域的元素存入同一个桶中,也就是根据元素值特性将集合拆分为多个区域,则拆分后形成的多个桶,从值域上看是处于有序状态的。对每个桶中元素进行排序,则所有桶中元素构成的集合是已排序的。如果桶的大小划分得足够小,到达每个元素之间的最小差值,则可以保证每一个桶里面所有的数据都是一样的,入桶后的数据也就不需要再次进行排序,这种情况也就是桶排序时间复杂度最优的情况即O(n)O(n)O(n).一般情况下桶排序的时间复杂度为O(n+nlog(

2021-08-28 15:45:53 4972 1

原创 排序算法——插入排序

介绍从头实现插入排序。插入排序是一种比较简单的排序方式通过将新的元素插入到已经排好的序列中来完成排序的目的。其最坏时间复杂度为O(n2)O(n^2)O(n2),最好时间复杂度为O(n)O(n)O(n),平均时间复杂度我为O(n2)O(n^2)O(n2). 是一种比较基础而又低效的排序算法,在数据量较小时可以使用,此外,插入排序是稳定的。实现步骤将数组第一个元素作为已排序序列。依次遍历后续元素,将每个元素与以排好序列中的元素依次比较,直到找到一个合适的位置将其插入进去。图解对[17,5,

2021-08-28 15:45:47 134

原创 排序算法——堆排序

概述从头实现堆排序。堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。如果要从大到小排序,则应该使用大根堆,即根节点的值最大。时间复度为O(nlog(n))O(nlog(n))O(nlog(n)).步骤建堆(最大堆),常采用向上调整建堆将堆第一个元素与已排好数据前一位交换,进行下沉操作调整堆,同时乱序数据量减少一个直到所有数据排序完成可以看出,堆排序也是选择排序的一种

2021-08-28 15:45:32 313

原创 排序算法——归并排序

介绍从头实现归并排序。归并排序(MergeSort),是采用分治思想的一种算法,通过把要排序的数组依次递归对半拆分,当子数组达到长度1时,即只有一个元素,认为其为有序的,结束递归。使用递归排序时,无论原数组序列的排序情况如何,都要递归到最底层,所以时间复杂度相对固定。为O(nlog(n))O(nlog(n))O(nlog(n)). 归并排序可分为二路归并和多路归并,最常用的是二路归并,下文示例亦是针对二路归并排序的。另外,归并排序是稳定的。图解拆分阶段:合并阶段:示例代码def mer

2021-08-28 15:45:25 138

原创 排序算法——计数排序

概述从头实现计数排序。计数排序是一个非基于比较的[序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为O(n+k)Ο(n+k)O(n+k)(其中k是整数的范围),快于任何比较排序算法。但是,计数排序算法的快速是使用空间来换取的。当整数范围过大时,其效率甚至不如复杂度为O(nlog(n))O(nlog(n))O(nlog(n))的比较排序类算法。计数排序适用于对整数进行排序,首先建立一个数组,初始值为0.数组的尺寸为需要排序元素的最

2021-08-28 15:45:17 83

原创 排序算法——快速排序

介绍从头实现快速排序。快速排序(Quick Sort)是对冒泡排序的一种改进。它运用到了分治思想,对每一个子序列分别排序。其平均时间复杂度为O(nlog(n))O(nlog(n))O(nlog(n)),最坏时间复杂度为O(n2)O(n^2)O(n2)。虽然在时间复杂度上并没有显著的优势,但在实际运用中效率比同时间复杂度的一些算法要高。实现基本步骤选取一个基元素,作为排序的对比标准,一般选取数组的第一个元素,也可以在中间随机选取。选取左指针和右指针(数组的以一个元素索引和最后一个元素索引)。

2021-08-28 15:45:09 88

原创 排序算法——冒泡

介绍手动从头实现一遍十大排序算法,便于加深理解。冒泡排序(Bubble Sort)就是元素两两比较,大的放后面,相等则不理会。交换完一次序列后最大的元素在序列尾部,第二次遍历时可以不予理会。反复遍历直到所有数排序完成。冒牌排序的最大时间复杂度为O(n2)O(n^2)O(n2),即所有元素以反序排列时。冒泡排序中,最大元素一个个漂浮到序列尾部,如同水泡冒起,因而得名。实现public class BubbleSort { public static void main(String[] a

2021-08-28 15:45:01 63

原创 排序算法——基数排序

概述从头实现基数排序。基数排序(radix sort)算法,就是按照整数的个位、十位、百位…等依次排列元素,局部最优排列最终可以获得全局最优。基数排序可以分为LSD和MSD两种,LSD就是从低位往高位排(个十百…),MSD是从高位往低位排(…百十个)。基数排序的时间复杂度为O(n∗k)O(n*k)O(n∗k),其中nnn为元素数量,kkk为最大元素的最高位(个位为1,十位为2…),当元素不是很大时(即kkk很小)可认为时间复杂度为O(n)O(n)O(n).实现过程算法步骤:取得数组中的最

2021-08-28 15:40:52 1416

原创 内网穿透-NPS搭建

简介NPS是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。准备工作带有公网IP的服务器(此处以阿里云为例)本地服务器NPS服务端和客户端步骤前往https://github.com/ehang-io/nps可查看NPS相关信息。在公网服务器和本地服务

2021-07-31 12:05:01 3804

原创 使用google云GPU服务器免费训练模型(薅羊毛)

简介Google Colab是一个云端Jupyter 笔记本环境,它是完全免费的,唯一的限制条件是需要挂个梯子,毕竟是谷歌的东西。使用方式1.创建Colaboratory在谷歌云盘中新建中选择更多——>Google Colaboratory建立一个Jupyter文件。创建文件文件概况2.基本使用此文件中的基本命令使用与Jupyter相同,但是它还支持dos命令,只需要加上!前缀即可:!pwd!ls!pip install pyqt5此运行环境本质上是一个lin

2021-07-31 11:59:06 3529 2

原创 免费搭建自己的私人服务器

一直想搭建一个私人服务器,常用的NAS成本太高,直接放弃。后来无意间发现可以用内网穿透来做这个事情,手中刚好有一台闲置不常用的电脑,便把它作成了一个私有网盘了。整个搭建过程很简单,而且零成本。准备工作PhPstudy可道云utools下载可道云,从官网下载PhPstudy和utools并安装,从utools中搜索安装内网穿透工具。搭建步骤启动PhPstudy进行相关配置,在PhPstudy的安装目录下找到 .\phpstudy_pro\WWW 文件夹,将文件夹中的内容删除,然后将可道云的压

2021-04-30 17:29:24 13696 3

原创 动态规划

动态规划(Dynamic programming,简称DP),是一种在多学科中常用的复杂问题求解方法,它是一种方法而不是一种算法。它的最基本思想及为将一个问题分解为多个子问题来进行求解。概述动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。动态规划在查找有很多重叠子问题的情况的最优解时有效。

2021-04-30 17:26:44 272 1

原创 Pycharm之库的导入顺序?

使用python时遇到了一个问题:Cannot mix incompatible Qt library (version 0x50907) with this library (version 0x50a01),通过字面的意思来看这是因为qt版本冲突,网上找了很多解决方法都是删库,这个处理方式着实不方便,后来在一位博主出找到了另一种解决方式。以下是冲突代码:import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimp

2021-04-30 17:25:36 551 1

原创 外链图床-PicGo-Gitee

前言刚开始写建立博客的时候,头疼过图片该如何处理:直接放github的仓库里吧。可是随着图片越来越多,每次pull、clone都需要耗费大量的时间。而且github的仓库加载很慢,影响博客的流畅性。外链图床吧。可是国内基本上没有什么好用的免费图床,七牛云之类的都需要收费的。国外的图床加载速度又是特别的慢。自己搭建。图床搭建所使用的工具为PicGo、Gitee、Typora. 在这之前,我一般在VSCode上面写Markdown文档,但是现在开始添加图片到博客中去,转而使用Typora,以便

2021-04-30 17:24:10 690 1

原创 Python创建列表的正确姿势

—如果按照下面的方式创建了一个表中表:a = [[]] * 10这事用来存放对应位数上的元素的。在append元素的时候发现所有子列表是一起变化的。很自然的想到子列表是共用同一个地址的。查看一下内存地址果然如此。a = [[]] * 10for i in a: print(id(i))[out]:2502709438920250270943892025027094389202502709438920250270943892025027094389202502709438

2021-04-30 17:18:50 201 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除