
算法
算法
鸭梨的药丸哥
文耀
展开
-
牛顿迭代法
牛顿法是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。牛顿法常用来求解非线程方程近似根。牛顿法通过迭代的方式去逼近方程的解。如图所示,牛顿法通过迭代的方式去逼近方程的解,通过利用初始点的斜率去逼近方程的根。而点的斜率公式又可以通过方程的导数得出。我们在斜率做斜线,求出与轴的交点,重复以上过程直到无限接近于0即可。 设有一非线性方程,为了求该方程的根,可以设一个初始值,设该点的斜率方程为,那么和X轴有交点。那么,可以得出。求出后就继续求,。直至接近于0,当然也可以用两个点和之间的差接近于原创 2022-07-06 00:47:47 · 1109 阅读 · 0 评论 -
HashMap解析
HashMap解析HashMap的两个版本HashMap在JDK7之后发生了一些改变,所以有两个版本:JDK7下的HashMap(数组+链表)JDK8下的HashMap(数组+链表+红黑树)HashMap(java7版本)结构解析Java7的版本下的HashMap如下:HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。并且HashMap 的数组是运行扩容的,也就是说当数组不够用时,可以通过扩容来扩大数组的容量。HashMap数组中存储的是Entry 的实例。Entry原创 2021-04-07 18:26:59 · 140 阅读 · 2 评论 -
Burst trie(爆炸式字典树)解读
burst trie(爆炸式字典树)Burst trie组成介绍burst trie有三个不同的组成部分,一组records,一组containers,还有一个access trie。records包含一个字符串,必要信息(统计数据或单词位置等),一个指针(指向实体数据的指针)containers是一个records的集合,对于一个深度为K的容器,所有字符串的长度至少为k,并且所有字符串的前k个字符都是相同的。access trie是containers中的叶子。Burst trie例子看原创 2022-03-28 14:13:36 · 1309 阅读 · 0 评论 -
数据结构(一)--稀疏数组
数据结构复习笔记(一)–稀疏数组介绍在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。如:0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 5 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0原创 2021-07-05 15:53:53 · 129 阅读 · 0 评论 -
数据结构(二)--队列
数据结构(二)–队列文章目录数据结构(二)--队列介绍代码实现数组方式实现普通队列环形队列链式实现单向队列介绍队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。**特点:**先进先出代码实现数组方式实现普通队列front代表队列队头元素的前一个位置,rear为队尾元素当前位置初始化:front=-1,rear=-1当队列空:fr原创 2021-07-05 15:51:57 · 534 阅读 · 0 评论 -
数据结构(三)--链表
数据结构(三)–链表文章目录数据结构(三)--链表介绍单链表代码实现翻转链表取出倒数第n个有效节点介绍链表又分:单链表双链表单链表头节点不存储数据,所有操作临时引用指向head;删除/插入节点:先判断当前节点是否满足删除或插入条件,然后判断是否可以移动,最后移动(反复)遍历节点:判断是否可以移动,移动,打印打印某一节点:判断是否可以移动,移动,判断当前节点是否可以打印(反复)代码实现先实现节点根据需要可以将数据域data的类型改为泛型**< T >**publ原创 2021-07-04 21:04:55 · 210 阅读 · 2 评论 -
最长回文串--动态规划
最长回文串–动态规划参考:https://writings.sh/post/algorithm-longest-palindromic-substringclass Solution { public String longestPalindrome(String s) { int len = s.length(); //为了操作方便,将string变char[] char[] str = s.toCharArray();原创 2021-04-19 11:52:33 · 181 阅读 · 0 评论 -
n人过桥问题
n人过桥问题(Java)文章目录n人过桥问题(Java)过桥的两种方案判断当前使用那种过桥方案动态规划法子问题的划分代码贪心算法子问题的划分代码过桥的两种方案方案一:最快的和最慢的过桥,回来最快的,然后最快的和次慢的过桥,回来最快的。(明显的贪心法,好处:回来得快。)方案二:最快的人和次快的先过桥,回来最快的,然后最慢的两个过桥,回来次快的。(好处:快的不会最慢的拖累)判断当前使用那种过桥方案当前如何过桥跟当前还未过桥的人数有关,主要分三大情况:人数大于3:如果方案一time<方案原创 2021-04-05 16:52:48 · 524 阅读 · 2 评论 -
两数组中位数
leetcode 4----两数组中位数解法(一)通过新建数组的办法,将两个数组合并成一个,然后找中位数,代码容易理解,但不是很快并且有点浪费空间。public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len = nums1.length+nums2.length; int i = 0,j = 0,k=0; while(i<nums1.length &&am原创 2021-04-05 15:03:42 · 633 阅读 · 0 评论 -
二叉树常用方法(一)
二叉树常用方法(一)树节点public class Node { public int data; public Node leftNode; public Node rightNode; public Node(){ this.data = -1; } public Node(int data){ this.data = data; this.leftNode = null; this.原创 2021-04-04 00:37:45 · 243 阅读 · 0 评论 -
判断单链表是否有环
判断单链表是否有环使用快慢指针的方式判断链表十分有环。public ListNode detectCycle(ListNode head) { if(head == null) return null; //定义快慢指针 ListNode fast_P = head, slow_P = head; //只要后面有路,两指针就继续追逐 while(fast_P.next != null && fast_P.ne原创 2021-04-03 23:03:01 · 100 阅读 · 0 评论 -
堆排序
堆排序堆的特点堆就是用数组实现的二叉树,并且堆是属于完全二叉树。堆的父节点的值都比其子节点的值要大(或者小)。堆分最大堆或者最小堆,最大堆的根节点是整个数组中最大的数。(以此类推最小堆)知道一节点的下标,可以反推出其父亲节点和两个孩子节点的下标。father = (i-1)/2, leftchild = 2 * i+1,rightchild = 2 * i+2heapify当左右子树都是堆时,而因为根节点值导致整个二叉树无法成为堆时,可以通过heapify对改二叉树进行调节,使得改二叉树原创 2021-04-03 00:49:36 · 165 阅读 · 0 评论 -
快速排序
快速排序快速排序(从小到大排序)其实思想就是,将比基准点小的移动到基准点前面,比基准点大的移动到基准点后面,并且基准点能在排序中找到确定的位置,并起到分割的作用。前面和后面两个相对有序的区间继续做快速排序。写法一对排序的数组进行左右扫描,根据基准点的值进行前后相换。public static void sort(int[] arr,int start,int end){ if (end-start <= 0) return; //进行快速排序,并返回基准点原创 2021-04-02 23:27:22 · 345 阅读 · 0 评论 -
归并排序
归并排序归并排序分成:分,并两大步骤,使用的分治的思想。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。伪代码分割分割需要用到递归。public static int[] sort(int[] arr,int start,int end){ //递归函数出口 //计算分割线,可以根据 //划分 }合并合并两个相邻的数组public stat原创 2021-04-02 18:35:38 · 92 阅读 · 0 评论 -
插入排序
插入排序直接插入排序插入排序(Insertion-Sort) 的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。public static void sort(int[] arr){ if (arr.length == 0) return原创 2021-04-02 13:45:34 · 125 阅读 · 0 评论 -
选择排序
选择排序遍历无序数列,找到无序区间中的最小(或最大值)放到数列中其数对应的位置。public static void sort(int[] arr){ if (arr.length == 0) return; int minindex = 0; for (int i = 0;i<arr.length-1;i++){ //无序区间最小值下标 minindex = i; //找最小值原创 2021-04-02 13:13:22 · 93 阅读 · 0 评论 -
冒泡排序的改良版
冒泡排序的改良版循环优化外循环优化冒泡排序其实无需写死排序arr.length-1趟,因为在对一些相对有序的数列进行冒泡排序时,可能循环排序一遍这个数列就变得有序了,如:{1,2,3,4,5,7,6,8,9},只需要7和6调换一次数列就有序了。只要一次冒泡的过程没发生交换行为其实我们就可以判定这个数列是有序的了。伪代码public static void sort(int[] arr){ for(int i = 0;i<arr.length-1;i++){原创 2021-04-02 13:07:20 · 430 阅读 · 0 评论