看下基于Python的必备算法描述

来些感兴趣的东西,也切合当下信息科技发展的方向,说不定在未来某一天用的上。本文结合网上资源和前辈的工作经验,梳理出几个比较简单基础的算法。

本文的程序算法,使用大家比较常见的Python语言进行描述。

基础算法

排序算法

排序算法有很多种,如冒泡排序、选择排序、稀尔排序、归并排序、堆排序、插入排序、快速排序等。如果是计算机专业这几种算法应该是相当熟悉了,如果不是计算机专业的学生,其实全部掌握也没必要。

目前有一个数组,数组里是6个数,我们需要将这个数组里的数按从小到大顺序排列。

待排序的数组:arr=[4,6,3,9,1,3]

基本实现思路:

  1. 构建一个临时存放数据的参数:temp。
  2. 从数组中第一个元素开始,依次对两个相邻的元素进行比较,如果左侧的数字大于右侧的数字,则交换位置,交换位置,就需要用到temp。
  3. 运算过程:arr[0]=4,arr[1]=6,4<6,满足条件,则继续
  4. arr[2]=3,而6>3,则需要将 arr[1]和arr[2]交换位置,令temp =aar[1],这时temp的值是6,arr[1]=arr[2],这时arr[1]的值为3,arr[2]=temp,arr[2]值为6。
  5. arr[2]=6,再与arr[3]=9作比较,满足条件。
  6. arr[3]=9再与arr[4]=1作比较,9大于4,交换。则arr[3]=1,arr[4]=9。
  7. arr[4]=9再与arr[5]=3作比较,9大于3,交换。则arr[4]=3,arr[5]=9。
  8. 这时的数组顺序变为[4,3,6,1,3,9]。
  9. 继续从数组的第一个元素开始,重复上述过程。

我们接下来看一下按照以上思路,数组中的元素是如何变化的:

  • 第一次:[4,3,6,1,3,9]
  • 第二次:[3,4,1,3,6,9]
  • 第三次:[3,1,3,4,6,9]
  • 第四次:[1,3,3,4,6,9]

我们为了验证我们的思路,前辈们的程序代码如下:

 

聚类算法

聚类算法在实际生产生活中用途比较广泛,像数据统计分析,人工智能识别物体,信息分类归集等。比较常见的聚类算法有:凝聚层次聚类、图团体检测(Graph Community Detection)、K-Means(K均值)聚类、均值漂移聚类、基于密度的聚类方法(DBSCAN)、高斯混合模型(GMM)的最大期望(EM)聚类等。

当然,以上这些算法专业性太强了。如果不从事专门领域的工作,产品经理用到这些算法的可能性也很小。

本文今天讲一个最为基础的聚类算法,非常便于大家理解。

我们还是以数组为例,arr=[1,1,2,3,5,4,5,4,2,3,3,1,3,3,4,5],我们的所谓的聚类,就是要统计这个数组中每个数字出现的次数,最终我们想到达到这样的输出结果:

  • 1出现3次
  • 2出现2次
  • 3出现5次
  • 4出现3次
  • 5出现3次

基本实现思路:

  1. 我们首先计算数字的长度,根据长度进行遍历。
  2. 构建一个字典。当并数组中的值作为字典的key,出现的次数作为value。
  3. 如果某个元素没有在字典中,则记录这个元素为key,value初始为1。
  4. 如果某个元素已经存在在字典中,则更新这个元素的value+1。
  5. 遍历完成,输出字典值。

我们为了验证我们的思路,前辈们的程序代码如下:

 

 

由于我们是没有排序的,所以输出顺序与之前预想的顺序有些差异。如果需要排序,则可以先将原数组中的数据排序后,再进行计算。

旋转算法

旋转的应用大家应该不陌生,最常见的就是手机或是电脑中查看照片的时候,照片的左转右转。图片旋转、视频旋转、文字内容旋转,其实归根到底都是数字矩阵的旋转。

所有的这些表现形式,底层都是一个个二进制的数字组成的。接下来,我们就是要在最基础的逻辑展开分析。

我们还是以数组进行讲解。

我们有数组 arr=[[1,2,3],[4,5,6]],准备向右旋转90度。为了便于大家理解,我这样表示:

原数组:

[1,2,3]

[4,5,6]

我们认为,数组的宽度[1,2,3]=3,为x轴;数组的高度2,为y轴。

向右旋转90度的后数组:

[3,6]

[2,5]

[1,4]

这时,宽度x变为2,高度y变为3。

基本实现思路:

1)我们观查上述数组发现,向右旋转90度后,组的维度由 2*3,变为了3*2。

2)而数字位置变化如下:

  • 1:[0][0]->[2][0]
  • 2:[0][1]->[1][0]
  • 3:[0][2]->[0][0]
  • 4:[1][0]->[2][1]
  • 5:[1][1]->[1][1]
  • 6:[1][2]->[0][1]

3)我们观察上述数字变化,大家发现什么规律?每个数的数组x和y坐标都左右进行了对调,变换后的y坐标是原x坐标的倒序。

4)进行对原数组宽度x(设为i)和高度y(设为j)的遍历,x遍历i的增加,正是新数字的坐标的减少。

即:新数组位置([x-1-i][j]=旧数组位置([j][i])

我们为了验证我们的思路,前辈们的程序代码如下:

为了便于大家理解,将原数组的值在遍历的时候也进行了输出展示。

 

也就是说,对原数组宽度x(设为i)和高度y(设为j)的遍历,高度y遍历j的增加,正是新数字的x坐标的减少。即:新数组位置([i][y-1-j]=旧数组位置([j][i])

我们为了验证我们的思路,前辈们的程序代码如下:

经过上述分析,大家是不是对旋转算法有了一个清晰的认识?

 

如果想旋转180度呢?如果大家有兴趣,可以按照上述思路进行分析实践。

总结

算法,是锻炼逻辑思维相对比较好的训练工具。有兴趣的同学,可以多看一些这方向的书籍,也有很多比较有意思的算法,可以在工作之余练练手,调节一下心情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长岭黎人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值