随笔分类 -  数据结构与算法

摘要:基本术语: 路径和路径长度: 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根 结点到第L层结点的路径长度为L-1。 结点的权及带权路径长度: 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的 阅读全文
posted @ 2023-04-11 15:17 Java厨师长 阅读(118) 评论(0) 推荐(0) 编辑
摘要:完全二叉树: 完全二叉树指的是除最后一层外,其余各层都是满的,而最后一层的节点从左到右是不间断的。满二叉树属于一种特殊的完全二叉树。 堆: 堆简单的来讲,物理结构是一维数组,而逻辑结构是完全二叉树。堆又分为小顶堆和大顶堆,小顶堆指的是每个节点的值都小于或等于其左右孩子节点的值,大顶堆指的是每个节点的 阅读全文
posted @ 2023-03-07 17:12 Java厨师长 阅读(33) 评论(0) 推荐(0) 编辑
摘要:哈希表: 哈希表又称散列表,结构为数组加链表,通过计算数据的哈希值能够准确知道这个数据在哪条链表上,加快查找速度(自己写的,可能不太准确)。 例子: 有一个公司,当有新的员工来报道时,要求将该员工的信息(编号,名字)加入,然后可以对这个员工进行增删改查,要求使用哈希表。 代码: 1 import l 阅读全文
posted @ 2023-02-07 17:11 Java厨师长 阅读(96) 评论(0) 推荐(0) 编辑
摘要:由来: 斐波那契数列:前两项之和等于第三项,假如下标为k,那么f[k] = f[k-1] + f[k-2]。如果将一条长为f[k]的线段分为两条线段,它们的长度分别为f[k-1]和f[k-2],这种分法很接近黄金分割比。斐波那契查找由此而来。 简介: 如果一个数组的长度是f[k],那么就可以把它分为 阅读全文
posted @ 2023-02-06 15:29 Java厨师长 阅读(192) 评论(0) 推荐(0) 编辑
摘要:简介: 插值查找需要在有序数组的前提下进行,与二分查找的原理一样,只不过二分查找寻找中轴的方式是折半 (left + right) / 2,而插值查找是 left + (right - left) * (value - arr[left]) / (arr[right] - arr[left])。 如 阅读全文
posted @ 2023-02-03 15:05 Java厨师长 阅读(91) 评论(0) 推荐(0) 编辑
摘要:思路: 二分查找是基于有序数组才能使用,这里举例的是从小到大的有序数组。通过中轴值与目标值进行比较,来判断目标值是在中轴的左边还是右边,以此来缩小查找范围。利用递归进行不断查找,没有找到那么退出。如果找到了,就向左向右循环看看紧挨着的值是否也等于目标值,如果等于,那么也将它们的下标返回出去。 代码: 阅读全文
posted @ 2023-02-02 17:54 Java厨师长 阅读(14) 评论(0) 推荐(0) 编辑
摘要:简介: 线性查找是直接将数组进行遍历,将目标查找出来。方法简单粗暴,效率较低。 代码: 1 /** 2 * 线性查找 3 * @param arr 4 * @param value 需要查找的值 5 * @return 6 */ 7 public static List<Integer> linea 阅读全文
posted @ 2023-02-02 15:19 Java厨师长 阅读(18) 评论(0) 推荐(0) 编辑
摘要:简介: 基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。 思路: 如果数组中有负数,那么让所有的数加上最小数的绝对值,将所有的数"提升"为正数再进行排序。准备十个桶分别为0-9,用数的某个位上的值去匹配,然后将数放进对 阅读全文
posted @ 2023-02-02 14:06 Java厨师长 阅读(49) 评论(0) 推荐(0) 编辑
摘要:思路: 利用递归的方式将数组不停的拆解,直到无法拆分为止。然后将其中的两个数组(拆解后的子数组)进行两两合并成一个有序数组,直到两个子数组合并后就是原数组则结束。 具体两个数组如何合并成一个有序数组如下: 代码: 1 /** 2 * 归并排序 3 * @param arr 需排序的数组 4 * @p 阅读全文
posted @ 2023-02-01 17:22 Java厨师长 阅读(15) 评论(0) 推荐(0) 编辑
摘要:思路: 将数组的第一个元素作为基准值,右索引先从右到左找到比基准值小的,左索引从左到右找到比基准值大的,然后交换,一直到左索引和右索引相遇。再将相遇的那个值与基准值交换。那么基准值左边的都是比它小的,右边的都是比它大的。 以基准值为中轴将数组一分为二,继续上面的操作将两个子数组都变成基准值左边的都比 阅读全文
posted @ 2023-02-01 15:42 Java厨师长 阅读(27) 评论(0) 推荐(0) 编辑
摘要:插入排序存在的问题: 数组 arr = {2,3,4,5,6,1}, 这时需要插入的数是1,那么就要逐个将其他元素往后移,再把1放在首位。当需要插入的数是较小的数时,后移的次数明显增多,对效率很有影响。 希尔排序: 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也 阅读全文
posted @ 2023-02-01 14:02 Java厨师长 阅读(24) 评论(0) 推荐(0) 编辑
摘要:思路: 将数组的第一个元素作为有序数组,其余的作为无序数组,从无序数组中取一个跟有序数组比较,将其放在合适的位置。那么有序数组就有两个元素,无序数组就减少一个元素。 依此类推,每一轮从无序数组里取一个放到有序数组里面排序,共arr.length - 1轮 代码: 1 /** 2 * 插入排序 3 * 阅读全文
posted @ 2023-02-01 10:20 Java厨师长 阅读(17) 评论(0) 推荐(0) 编辑
摘要:思路: 选择排序是假定第一个位置上的数是最小的,赋给min和minIndex,然后将其余的数与它比较,如果找到更小的,就把min和minIndex替换掉。那么第一轮就将最小的值以及下标找到了,将最小值与arr[0]进行交换 依次下去,每一轮都将未排序中最小的往前面排,需要arr.length - 1 阅读全文
posted @ 2023-01-31 16:40 Java厨师长 阅读(37) 评论(0) 推荐(0) 编辑
摘要:思路: 冒泡排序是将下标最小的值与相邻的值进行比较,如果逆序则交换位置,然后后移一位继续与相邻的值进行比较, 所有值都参与过就结束。第一轮将最大的值(代码注释里的第0大)放到最后一个位置(代码注释里的倒数第0个位置) 依次类推,每一轮确定第i大的数放到倒数第i个位置,共有arr.length - 1 阅读全文
posted @ 2023-01-31 15:42 Java厨师长 阅读(26) 评论(0) 推荐(0) 编辑
摘要:问题: 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 代码: 1 import org.junit.Test; 2 import java.util.Arrays; 3 4 public class EightQueens 阅读全文
posted @ 2023-01-19 13:52 Java厨师长 阅读(51) 评论(0) 推荐(0) 编辑
摘要:问题: 迷宫为8x8的二位数组,其中0为道路,1为墙,人如何在起点和终点之前获取一条可达路径。 自定义的概念: 当前位置:人当前所在的位置,通过当前位置不断变动形成一条路径。 策略:人站在当前位置上,向哪个方向来前进到下一个位置,以及如果下一个位置不可到达终点,那么换哪个方向继续前进(例:下->右- 阅读全文
posted @ 2023-01-18 15:52 Java厨师长 阅读(18) 评论(0) 推荐(0) 编辑
摘要:前缀表达式: 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3。 中缀表达式: 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形 阅读全文
posted @ 2023-01-17 18:09 Java厨师长 阅读(59) 评论(0) 推荐(0) 编辑
摘要:入栈: 出栈: 代码: 1 import java.util.Scanner; 2 3 public class ArrayStackTest { 4 public static void main(String[] args) { 5 ArrayStack stack = new ArraySta 阅读全文
posted @ 2023-01-16 14:34 Java厨师长 阅读(55) 评论(0) 推荐(0) 编辑
摘要:约瑟夫问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数, 数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 单向环形链表图示: 代码: 1 import lombok.Dat 阅读全文
posted @ 2023-01-13 14:46 Java厨师长 阅读(15) 评论(0) 推荐(0) 编辑
摘要:图示: 代码: 1 import lombok.Data; 2 3 public class DoubleLinkedListTest { 4 public static void main(String[] args) { 5 DoubleNode node1 = new DoubleNode(1 阅读全文
posted @ 2023-01-11 15:31 Java厨师长 阅读(12) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示