自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java、python实现啊哈算法 —— chapter4 深度优先、广度优先(3)

这一部分是实现炸弹人游戏,与之前的两个例子大同小异,只是需要注意两点1. 需要增加一个在某个位置上计算可以消灭敌人数量的方法2. 由于这个场景中不是求最短路径或者放置纸牌数字,之前的场景中放置完之后需要撤回,因为纸盒放置纸牌允许一个纸盒中放置纸牌后再拿出去,最短路径允许走到一个盒子之后再离开,之后的路径中再次走过这个格子。 而在炸弹人游戏中,目的是求每个格子可以消灭的敌人数量,从而找到最多的那个格子,所以一个格子走过之后就不需要再次走了,因此深度优先的递归之后不需要加撤回的步骤。下面上代码:

2022-01-06 11:05:49 2337

原创 Java、python实现啊哈算法 —— chapter4 深度优先、广度优先(2)

这一部分的第二节是在地图上采取深度优先和广度优先策略,在一个方向一直深入,直到遇到障碍物之后,退回到上一步,尝试别的方向,由于也是需要撤回的,所以在递归之后需要有一步撤回的操作,否组一个格子被走过之后就不能再次走了。这个例子可以采用深度优先和广度优先两种方法实现下面上代码深度优先Java:import java.util.Scanner;public class JieJiuXiaoHa { static int[][] map = new int[50][50]; s

2022-01-06 10:40:58 847

原创 Java、python实现啊哈算法 —— chapter4 深度优先、广度优先(1)

第一个例子是用深度优先搜索实现类似于上一章中的回柴棍游戏,现在的场景是往箱子中放纸牌,注意一点,由于一张纸牌对应一个箱子,所以在一个箱子中尝试放置一张纸牌后,需要把这张纸牌收回,再尝试将其他纸牌放在这个箱子里。 下面上代码Java:import java.util.Arrays;public class DfsHuoChaiGunGame { static int[] digit = new int[10]; //初始化一个数组,存储火柴棍游戏中的9个数字 static i

2022-01-06 09:59:59 2163

原创 Java、python实现啊哈算法 —— chapter3 火柴棍等式

逻辑书上写的已经很清楚了,但是书上的代码里有一点错误,最大能取到的数字是‘11111’ 而不是‘1111’,好了,下面上代码:python:def fun(x): #初始化一个方法用来查看某个搭建某个数字需要多少根火柴棍 num = 0 #初始化一个变量存储数字x需要的总的火柴根数 f = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6] if x // 10 != 0: #如果这个数是两位数以上,需要从个位数开始逐个计算每个单独的数字需要的火柴个数

2021-12-31 15:19:35 1232 1

原创 Java、python实现啊哈算法 —— chapter3 枚举 炸弹人

这个例子不是很难,也没有太多抽象的内容,细心就好,下面上代码python:import numpyimport numpy as npglobal nglobal mapdef zhadanren(): global n, map res = -1 res_i = -1 res_j = -1 for i in range(n): for j in range(n): #从左上角第一个元素循环遍历地图中的所有元素,找到空地放置炸弹

2021-12-30 19:49:59 626

原创 Java、python实现啊哈算法 —— chapter2 链表 模拟链表

这一部分是用两个数组来模拟链表的功能,一个数组的下标表示节点的编号,下标指向的数字代表链表节点的值。另一个数组存储的是链表节点之间的关系,数组下标表示某个节点的编号,数组中下标位置的值是以这一下标值为编号的节点的下一个节点的编号。也有一些抽象,不过把代码实现一遍就清晰很多了下面上代码:python:import numpy as npdef simulation_list(): data = np.zeros((100,), dtype=int) next = n

2021-12-30 14:27:26 597

原创 Java、python实现啊哈算法 —— chapter2 链表

链表部分的难点主要在于提前初始化一个空对象,用来指向新创建的节点的地址,并且将这个已经创建好的节点当作上一个节点,有一些抽象,不过蛮容易想明白的,下面上代码:python:class Node(object): def __init__(self, val): self.val = val self.next = Nonedef create_list(): n = int(input('请输入链表中节点个数:')) global he

2021-12-30 11:18:52 525

原创 Java、python实现啊哈算法 —— chapter1 小哼买书

这部分就是将chapter讲的3个排序算法:桶排序、冒泡排序、快速排序应用到买书的场景中去,话不多说,上代码:python:import numpy as npglobal n, adef swap(i, j): tem = a[i] a[i] = a[j] a[j] = temdef bucketsort(limit): #桶排序,以空间换时间,书号的范围多大就建一个多长的数组 global n #有多少本书 global a #标记图书号的列表

2021-12-27 16:59:34 896

原创 Java、 python实现啊哈算法 —— chapter1 快速排序

快速排序可以理解为:以最左边的元素为基准数,左右各一个指针,右边指针向左移动,直到找到小于基准数的数 或者 两个指针相遇时 停止,左边指针向右移动,直到找到大于基准数的数 或者 两指针相遇时停止。有两个点是我在实现算法时觉得比较重要的:1)退出递归的条件,退出递归,当出现以下情况时会退出递归, a. 队列中有两个元素,例如[2, 1],此时右指针停在1下面,左指针向右移动也停在1下面,交换两个元素,之后分别比较队列[1] 和 [2],这两个队列中都是left == righ...

2021-12-23 10:43:16 836

原创 Java、python实现啊哈算法 —— chapter7 优先队列 堆(四)

前面已经分块拆解讲解了堆这种优先队列,堆排序这一算法中涵盖了前面讲过的各个模块的知识点,下面是完整的包含两种堆排序的代码:Java:import java.util.Arrays;public class Heap { static int[] heap = {99, 5, 36, 7, 22, 17, 46, 12, 2, 19, 25, 28, 1, 92}; //初始化一个数组,存储堆中的元素 static int n = heap.length; //向下调整

2021-12-20 16:36:48 648

原创 Java、python实现啊哈算法 —— chapter7 优先队列 堆(三)

4. 堆排序堆排序有两种方式: 1)首先创建一个最小堆,将顶部元素输出存入一个新的数组中,然后把堆中最后一个元素移到堆顶,将堆顶元素做向下调整,调整完后堆顶元素就是最小值,再输出存入数组中,如此循环,最终存放在新数组中的数就是按从小到大排好序的了。这种方法的时间复杂度为O(NlogN) 2)更好的方法是建立一个最大堆,然后将堆顶元素和队列中最后一个元素交换位置,因为是从小到大排序,交换之后最大节点就到队列最后了。然后将队列的长度减一,对堆顶元素做向下调整。重复以上过程...

2021-12-20 16:34:39 619

原创 Java、python实现啊哈算法 —— chapter7 优先队列 堆 (二)

2. 不删除堆中的节点,只是增加一个节点当需要向堆中加入一个节点时,只需要将新加入的节点放在队列最后,然后将新加入的节点向上调整。由于已经是一个最小堆,所以堆中的父节点都小于子节点。首先将新加入的节点与他的父节点比较,如果父节点大于这一节点,则将这一节点与他的父节点交换位置,然后再将交换位置之后的节点再与当前位置上的父节点进行比较,如果还小于父节点,则再交换位置。直至不小于父节点位置,这一过程的时间复杂度也为O(logN)代码如下:Java://向上调整,当不删除元素,仅仅插入一个新元

2021-12-20 16:30:50 906

原创 java、python实现啊哈算法中的算法 —— chapter7 堆 优先队列(一)

所有父节点都比子节点大的完全二叉树叫做最大堆,所有父节点都比子节点小的完全二叉树叫做最小堆。下面介绍堆的作用:1. 删除队列中的最小值,并且插入一个新的值,再求队列中的最小值如果要从数组的N个元素中找出最小值,需要将数组中的每个数逐个比较,遍历整个数组,这样时间复杂度是O(N),插入一个新的值后,再从数组中找到最小值,又需要O(N)的时间。假如进行N遍删除、插入、再找最小值的操作,则需要的时间复杂度为O(N**2)如果采用堆这种队列,可以先将这些元素按照最小堆的要求放入完全二叉树,最小值就在

2021-12-20 16:23:30 50

原创 java、python实现啊哈算法 —— chapter8 最小生成树的 Prim算法

这一算法的核心其实就是Dijkstra算法,这也是上一篇文章写Dijkstra的原因。但是有一点不同:Dijkstra是单源最短路径,即每个点到原点的最短路径。Prim算法的核心是每一个点到最小生成树的最短路径。下面上代码Java版:import java.util.Arrays;public class PrimBasic { //初始化最大值 static double max = Double.POSITIVE_INFINITY; //初始化一个邻接矩阵

2021-12-16 10:31:08 649

原创 java、python实现啊哈算法书中算法 之 单源最短路径 —— Dijkstra算法

Dijkstra算法是求单源最短路径的算法,即以某一点为源点,求这一点到其他所有点的最短路径。这一算法主要关注的是目前距离原点最近的点的出边。算法具体的流程就不赘述了,书中写的很详细,这里总结几个关键点,可以帮助理解算法: 1. 算法中每轮循环都会找到最近的一个确定点,这一点到原点的权值就被确定下来。例如,第一步以2为确定点,更新2点的出边所能到达的所有点到原点的最小权值 2. 以2点为确定点更新完点2的出边所能到达的点的权值之后,再从除了2点之外其他...

2021-12-15 16:29:40 800

原创 啊哈算法 java、python实现书中算法 —— chapter7 并查集

实现啊哈算法书中的算法,有java和python两个版本,本人非科班出身,出于兴趣自学算法,发布上来仅供大家交流,有可以改进的地方欢迎大家踊跃指点!

2021-12-15 11:49:12 861

空空如也

空空如也

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

TA关注的人

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