<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lu_long的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lu_long</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lu_long]]></copyright><item><title><![CDATA[马踏棋盘算法（骑士周游问题）——贪心算法优化]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104277772</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104277772</guid><author>lu_long</author><pubDate>Wed, 12 Feb 2020 15:24:08 +0800</pubDate><description><![CDATA[骑士周游问题

在8x8的国际棋盘上，按照马走日的规则，验证是否能够走遍棋盘。

解题思路


创建棋盘 chessBoard，是一个二维数组。
将当前位置设置为已经访问，然后根据当前位置，计算马儿还能走哪些位置，并放入到一个集合中（ArrayList），最多有8个位置，每走一步，就使用step+1。
遍历ArrayList中存放的所有位置，看看哪个可以走通，如果走通，就继续，走不通，就回溯。
判...]]></description><category></category></item><item><title><![CDATA[弗洛伊德算法——最短路径算法]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104269497</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104269497</guid><author>lu_long</author><pubDate>Tue, 11 Feb 2020 22:07:59 +0800</pubDate><description><![CDATA[弗洛伊德（Floyd）算法介绍

和Dijkstra算法一样，弗洛伊德（Floyd）算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
弗洛伊德算法（Floyd）计算图中各个顶点之间的最短路径 。
迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。
弗洛伊德算法VS迪杰斯特拉算法：迪杰斯特...]]></description><category></category></item><item><title><![CDATA[迪杰斯特拉算法——最短路径算法]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104261204</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104261204</guid><author>lu_long</author><pubDate>Tue, 11 Feb 2020 16:06:40 +0800</pubDate><description><![CDATA[基本介绍
迪杰斯特拉（Dijkstra）算法是典型最短路径算法，用于计算一个结点到其他结点的最短路径。它的主要特点是以起始点为中心向外层层扩展（广度优先搜索思想），直到扩展到终点为止。
基本思想

集合S表示最短距离已经确定的顶点集。
其余的顶点放在另一个集合V-S中。
数组D来记录当前所找到的从源点s到每个顶点的最短特殊路径长度。
从尚未确定最短路径长度的集合V-S中取出一个最短特殊路径长度最小...]]></description><category></category></item><item><title><![CDATA[常用算法——动态规划算法]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104123163</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104123163</guid><author>lu_long</author><pubDate>Fri, 31 Jan 2020 15:30:45 +0800</pubDate><description><![CDATA[动态规划算法
算法介绍

动态规划（Dynamic Programming）算法的核心思想是：将大问题划分为小问题进行解决，从而一步步获取最优解的处理算法
动态规划算法与分治算法类似，其基本思想也是将待求解问题分解成若干个子问题，先求解子问题，然后从这些子问题的解得到原问题的解。
与分治法不同的是，适合于用动态规划求解的问题，经分解得到子问题往往不是互相独立的。（即下一个子阶段的求解是建立在上一个...]]></description><category></category></item><item><title><![CDATA[常见算法——分治算法]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104114179</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104114179</guid><author>lu_long</author><pubDate>Thu, 30 Jan 2020 12:58:26 +0800</pubDate><description><![CDATA[常见算法——分治算法
基本介绍

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题，这些子问题相互独立且与原问题性质相同。求出子问题的解，就可得到原问题的解。即一种分目标完成程序算法，简单问题可用二分法完成。

基本思想

当我们求解某些问题时，由于这些问题要处理的数据相当多，或求解过程相当复杂，使得直接求解法在时间上相当长，或者根本无法直接求出。对于这类问题，我们往往先把它分解...]]></description><category></category></item><item><title><![CDATA[常用算法——二分查找（非递归）]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104107472</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104107472</guid><author>lu_long</author><pubDate>Wed, 29 Jan 2020 16:07:37 +0800</pubDate><description><![CDATA[二分查找（非递归）
基本介绍
二分查找也称折半查找（Binary Search），它是一种效率较高的查找方法。但是，折半查找要求线性表必须采用顺序存储结构，而且表中元素按关键字有序排列。

首先，假设表中元素是按升序排列，将表中间位置记录的关键字与查找关键字比较，如果两者相等，则查找成功；否则利用中间位置记录将表分成前、后两个子表，如果中间位置记录的关键字大于查找关键字，则进一步查找前一子表，否则...]]></description><category></category></item><item><title><![CDATA[图的创建和代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104086986</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104086986</guid><author>lu_long</author><pubDate>Sun, 26 Jan 2020 13:59:36 +0800</pubDate><description><![CDATA[要求：代码实现如下图结构

思路分析

存储顶点String 使用ArrayList
保存矩阵int[ ] [ ]edges

代码实现
package com.atguigu.graph;

import java.util.ArrayList;
import java.util.Arrays;

public class Graph {
	private ArrayList&lt;String...]]></description><category></category></item><item><title><![CDATA[平衡二叉树思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104083690</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104083690</guid><author>lu_long</author><pubDate>Sat, 25 Jan 2020 18:27:17 +0800</pubDate><description><![CDATA[基本介绍

平衡二叉树也叫平衡二叉搜索树（Self-balancing binary searchtree）又被称为AVL树，可以保证查询效率较高。
具有以下特点：它是一棵空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。平衡二又树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。
举例说明：


应用案例(一)——单旋转（左旋转）

以数列{4，3...]]></description><category></category></item><item><title><![CDATA[测试题]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104080330</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104080330</guid><author>lu_long</author><pubDate>Fri, 24 Jan 2020 15:19:00 +0800</pubDate><description><![CDATA[测试题
逆序打印单链表
解题思路：

方法1：先将单链表进行反转操作，然后再遍历即可，这样的做的问题是会破坏原来的单链表的结构，不建议。
方式2：可以利用栈这个数据结构，将各个节点压入到栈中，然后利用栈的先进后出的特点，就实现了逆序打印的效果。

// 方式2：
	// 可以利用栈这个数据结构，将各个节点压入到栈中，然后利用栈的先进后出的特点，就实现了逆序打印的效果
	public static ...]]></description><category></category></item><item><title><![CDATA[二叉排序树]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/104075012</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/104075012</guid><author>lu_long</author><pubDate>Thu, 23 Jan 2020 13:14:49 +0800</pubDate><description><![CDATA[二叉排序树
需求

给你一个数列（7，3，10，12，5，1，9），要求能够高效的完成对数据的查询和添加

解决方案分析

使用数组
数组未排序，优点：直接在数组尾添加，速度快。缺点：查找速度慢。
数组排序，优点：可以使用二分查找，查找速度快，缺点：为了保证数组有序，在添加新数据时，找到插入位置后，后面的数据需整体移动，速度慢。
使用链式存储-链表
不管链表是否有序，查找速度都慢，添加数据速度比数...]]></description><category></category></item><item><title><![CDATA[哈夫曼树]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103872847</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103872847</guid><author>lu_long</author><pubDate>Tue, 07 Jan 2020 13:49:24 +0800</pubDate><description><![CDATA[哈夫曼树基本介绍

给定n个权值作为n个叶子结点，构造一棵二叉树，若该树的带权路径长度（wpl）达到最小，称这样的二又树为最优二又树，也称为哈夫曼树（Huffman Tree），还有的书翻译为赫夫曼树。
哈夫曼树是带权路径长度最短的树，权值较大的结点离根较近。

哈夫曼树的重要概念

路径和路径长度：在一棵树中，从一个结点往下可以达到的孩子或孙子结点之间的通路，称为路径。通路中分支的数目称为路径长...]]></description><category></category></item><item><title><![CDATA[堆排序]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103840551</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103840551</guid><author>lu_long</author><pubDate>Sun, 05 Jan 2020 10:48:14 +0800</pubDate><description><![CDATA[堆排序
基本介绍

堆排序是利用堆这种数据结构而设计的一种排序算法，堆排序是一种选择排序，它的最坏，最好，平均时间复杂度均为O(nlogn)，它也是不稳定排序。
堆是具有以下性质的完全二又树：每个结点的值都大于或等于其左右孩子结点的值，称为大顶堆，注意：没有要求结点的左孩子的值和右孩子的值的大小关系。
每个结点的值都小于或等于其左右孩子结点的值，称为小顶堆。
大顶堆举例说明

小顶堆举例说明

一...]]></description><category></category></item><item><title><![CDATA[线索化二叉树]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103817957</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103817957</guid><author>lu_long</author><pubDate>Sat, 04 Jan 2020 15:31:48 +0800</pubDate><description><![CDATA[基本概念

n个结点的二叉链表中含有n+1【公式2n-（n-1）=n+1】个空指针域。利用二又链表中的空指针域，存放指向该结点在某种遍历次序下的前驱和后继结点的指针（这种附加的指针称为“线索"）
这种加上了线索的二又链表称为线索链表，相应的二又树称为线索二叉树（Threaded BinaryTree）。根据线索性质的不同，线索二又树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种
一个结点...]]></description><category></category></item><item><title><![CDATA[顺序存储二叉树]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103817034</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103817034</guid><author>lu_long</author><pubDate>Fri, 03 Jan 2020 11:38:15 +0800</pubDate><description><![CDATA[基本说明
从数据存储来看，数组存储方式和树的存储方式可以相互转换，即数组可以转换成树，树也可以转换成数组，如图。
顺序存储二叉树的特点：

顺序二又树通常只考虑完全二叉树
第n个元素的左子节点为2*n+1
第n个元素的右子节点为2*n+2
第n个元素的父节点为（n-1）/2
n：表示二叉树中的第几个元素（按0开始编号
如图所示）


代码实现
package com.tree;

public c...]]></description><category></category></item><item><title><![CDATA[二叉树删除结点思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103769842</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103769842</guid><author>lu_long</author><pubDate>Mon, 30 Dec 2019 21:19:31 +0800</pubDate><description><![CDATA[二叉树删除结点
思路分析
完成删除的操作
规定：

如果删除的结点是叶子节点，则删除该节点
如果删除的结点是非叶子节点，则删除该子树

思路：

因为我们的二叉树是单向的，所以我们是判断当前结点的子结点是否需要删除结点，而不能去判断当前这个结点是不是需要删除结点
如果当前结点的左子结点不为空，并且左子结点就是要删除结点，就将this.left=null；并且就返回（结束递归删除）
如果当前结点的右...]]></description><category></category></item><item><title><![CDATA[哈希表思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103504549</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103504549</guid><author>lu_long</author><pubDate>Thu, 12 Dec 2019 10:37:43 +0800</pubDate><description><![CDATA[哈希表
哈希表（散列）-Google上机题

看一个实际需求，google公司的一个上机题：
有一个公司，当有新的员工来报道时，要求将该员工的信息加入（id，性别，年龄，住址.），当输入该员工的id时，要求查找到该员工的所有信息。
要求：不使用数据库，尽量节省内存，速度越快越好=&gt;哈希表（散列）

哈希表的基本介绍
散列表（Hashtable，也叫哈希表），是根据关键码值（Key value...]]></description><category></category></item><item><title><![CDATA[斐波那契查找（黄金分割法查找）思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103362062</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103362062</guid><author>lu_long</author><pubDate>Tue, 03 Dec 2019 10:47:16 +0800</pubDate><description><![CDATA[斐波那契（黄金分割法）原理
斐波那契查找原理与前两种相似，仅仅改变了中间结点（mid）的位置，mid不再是中间或插值得到，而是位于黄金分割点附近，即mid=low+F（k-1）-1
（F代表斐波那契数列），如下图所示

对F（k-1）-1的理解：

由斐波那契数列F[k]=F[k-1]+F[k-2]的性质，可以得到**（F[k]-1）=（F[k-1]-1）+（F[k-2]-1）+1**。
该式说明...]]></description><category></category></item><item><title><![CDATA[插入查找思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103360827</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103360827</guid><author>lu_long</author><pubDate>Tue, 03 Dec 2019 09:40:27 +0800</pubDate><description><![CDATA[插入查找的原理

插值查找算法类似于二分查找，不同的是插值查找每次从自适应mid处开始查找。
将折半查找中的求mid索引的公式，low表示左边索引left，high表示右边索引right. key 就是前面我们讲的 findVal（二分查找）。


3. int mid=low+（high-low)* (key-arr[low]）/（arr[high]-arr[low]）；/* 插值索引* /
对...]]></description><category></category></item><item><title><![CDATA[查找算法之二分查找思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103339124</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103339124</guid><author>lu_long</author><pubDate>Sun, 01 Dec 2019 20:56:27 +0800</pubDate><description><![CDATA[查找算法介绍
在java中，我们常用的查找有四种：

顺序（线性）查找
二分查找/折半查找
插值查找
斐波那契查找

线性查找算法
有一个数列：{1，8，10，89，1000，1234}，判断数列中是否包含此名称【顺序查找】要求：如果找到了，就提示找到，并给出下标值。
二分查找算法
请对一个有序数组进行二分查找{1，8，10，89，1000，1234}，输入一个数看看该数组是否存在此数，并且求出下...]]></description><category></category></item><item><title><![CDATA[基数排序（桶排序）思路分析及代码实现]]></title><link>https://blog.youkuaiyun.com/lu_long/article/details/103334522</link><guid>https://blog.youkuaiyun.com/lu_long/article/details/103334522</guid><author>lu_long</author><pubDate>Sun, 01 Dec 2019 15:42:52 +0800</pubDate><description><![CDATA[基数排序（桶排序）介绍：

基数排序（RadixSort）属于“分配式排序”（DistributionSort），又称“桶子法”（Bucket Sort）顾名思义，它是通过键值的各个位的值，将要排序的元素分配至某些“桶”中，达到排序的作用
基数排序法是属于稳定性的排序，基数排序法的是效率高的稳定性排序
基数排序（RadixSort）是桶排序的扩展
基数排序是1887年赫尔曼·何乐礼发明的。它是这样...]]></description><category></category></item></channel></rss>