自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 问答 (1)
  • 收藏
  • 关注

原创 最小生成树的Prim算法和Kruskal算法--Java

最小生成树:最小生成树是在无向图中,找到连通的树。该树由无向图中的N个节点构成,由N-1条边构成且不存在回路,且其总价值最低。最小生成树存在的必要条件是当且仅当G是连通的。Prim算法:prim算法是选择一步步的让这颗树长成。在每一步,都要把一个节点当做根并往上加边,这样也就把相关联的顶点给加入到树中。算法需要两个数组:lowestCost数组和cloest数组。需要两个顶点集:U和V...

2019-03-28 14:30:05 886 1

原创 拓扑排序、dijkstra算法--Java

图的定义:图G={V,E}由定点V和边E组成。边就是顶点对,如果点对是有序的,那么图就是有向图;否则就是无向图。有的时候边上还有权值的项。图有两种存储方式,一种是邻接矩阵,一种是邻接表。如果用邻接矩阵进行存储的话,当顶点很多但是变又很少的情况下,此时的矩阵是稀疏矩阵,会造成空间的浪费。邻接表就是顶点数组,与这个顶点有关联的顶点会用一个List进行存储。这样会节省不必要的空间的浪费。定义后继节点...

2019-03-26 22:54:37 401

原创 桶排序-基数排序-计数基数排序--Java

前面已经讲述了很多排序算法,但是他们的排序算法都是基于两个值之间的比较,通过决策树的方法可以证明深度为d的二叉树则最多有个树叶。具有L片树叶的二叉树的深度至少是logL向上取整。因为N个元素的排列组合为N!。所以至少需要logN!次比较。通过推导只要是比较的算法,至少需要的时间复杂度为O(NlogN)。 一些好的排序算法是可以达到时间复杂度是线性的,桶排序就是其中一种。比如有N个数,但是...

2019-03-24 12:35:06 402

原创 快速排序--Java

快速排序是在实践中运行比较快速的一种排序算法。它的平均时间性能为O(NlogN),但它的最坏的时间性能也是O()。像归并排序一样,快速排序是也是一种分治的递归算法。快速排序的算法思想是选取一个枢纽,根据这个枢纽可以将数组分为三个部分,小于的一组,等于的一组,大于的一组。然后对小于和大于的进行排序,排序好后和等于的三者进行连接得到最后排序好的数组。快速排序的经典实现算法为:如果数组是0或者1个元...

2019-03-23 17:39:45 93

原创 归并排序--Java

归并排序是一种时间复杂度在最坏的时候是O(NlogN)的排序算法。它是递归算法的实例。在该算法中,要做的就是合并两个已经排序好的数组到临时数组中,比如A,B数组是已经排序好的算法,C是临时数组。算法就是indexA,indexB,indexC分别是各自数组的指针位置,在A或者B中选取最小元素存到C中。知道所有的A B所有的元素都遍历结束。这样得到的C就是排序好的数组了。该算法是很好的分治的算法,它...

2019-03-23 12:26:53 90

原创 堆排序--Java

在介绍二叉堆的时候,对于deleteMin()操作(删除最下元素)的时候,我们知道时间复杂度为O(logN)。而创建二叉堆的时候的时间复杂度为O(N)。所以用二叉堆实现的的堆排序的时间复杂度为O(NlogN)。代码:public class heapSort { public void sort(int[] nums) { buildHeap(nums); } //此时的开...

2019-03-22 23:47:18 73

原创 希尔排序--Java

希尔排序的名字由于这个算法的发明者叫希尔,该算法是第一批突破O()时间复杂度的算法之一。因为插入排序算法是短距离(一个个的)的进行比较替换的。而希尔排序是以一定的间隔进行比较。个趟比较随着算法的进行是逐渐减小的,直到比较相邻元素的最后一趟排序为止。所以希尔排序有时候也叫缩减增量排序,shell建议的序列为h = N/2向下取整或者向上取整。但是随着证明的进行,合适的增量应该为{1,5,19,41,...

2019-03-22 22:46:24 632

原创 插入排序--Java

插入排序是最简单的排序算法之一。插入N个数字,则插入排序由N-1趟排序组成。对于从i=1到i=N-1,插入排序保证在0到i的位置上都是已经排好序的。由于嵌套循环的每一次都花费N次迭代,因此插入排序时间复杂度为O()。但是插入排序有个特例就是如果数组本来就是将近有序的话,那么排序算法将会是线性时间。代码:public class insertionSort { public void...

2019-03-22 22:17:20 56

原创 左式堆--优先队列

1:在前面提到过的二叉堆的优先队列的插入操作是O(logN)的时间复杂度,删除操作因为需要将最后一个元素提到最前面,所以时间复杂度也是O(logN)的时间复杂度。构建二叉堆的时候,如果是单独一个个的插入,那么将花费O(N)的时间复杂度。而且如果想要合并连个二叉堆,必须在申请一个新的数组来存储,所以合并操作也会花费O(N)的时间复杂度。2:左式堆也像二叉堆那样具有结构性和有序性。但是左式堆是趋向...

2019-03-21 22:59:58 146

原创 红黑树

红黑树:红黑树是一颗黑节点完全平衡的树结构,其底层的原理依然是依据二叉搜索树的(父节点左孩子<父节点<父节点右孩子)。不同的是在创建的时候要依据节点的红黑色进行旋转变化。红黑树的特点(来自算法导论):1:每个节点的颜色只有红色或者黑色2:根节点是黑色的3:每个叶子节点(NIL)是黑色的4:如果一个节点的颜色是红色的,那么它的两个左右孩子的节点一定是黑色的5:对每...

2019-03-04 18:19:18 157

原创 AVL--平衡二叉树

平衡二叉树:平衡二叉树的数据结构特点是父节点的左右孩子之间的树的高度的差值不超过1。像堆和线性树都是平衡二叉树,但是对于二叉搜索树来说,如果数据的进入顺序不一样,树可能退化成链表。所以需要在创建二叉搜索树的时候对树的状态进行维护。对于创建过程中,可能出现的不平衡的现象总共可以分为四种情况。分别为LL;RR;LR;RL。我认为旋转的记忆可以想成:往哪边旋转哪边变高,另一边变低。比如当LL的时候,...

2019-03-03 18:27:03 126

原创 并查集 Union Find

并查集:在进行判断两个数据之间是不是有连接的操作中。如果我们单独用数组进行数据的存储,把有连接的数据的ID设置成相同的数字,那么这种数据结构进行查找操作的时候,时间复杂度是O(1),但是进行合并的时候,所进行的时间复杂度是O(n)。对于数据量较大的情况,O(n)将会是个非常慢的操作。所以这个时候需要并查集这种数据结构。这种数据结构更像是森林,每棵树上的数据是有连接的,不同树之间的数据是没有连接的。...

2019-03-02 16:46:17 134

原创 Trie

Trie:Trie这种数据结构主要应用在搜索字符串上。比如要想查询一个字符串是否存在数组中。可以用到的集合可以是TreeMap,TreeMap这种数据结构的特点是就算是最好的满二叉树,达到的时间复杂度也会是O(logn)。而Trie是这样一种数据结构,它的时间复杂度可以与要存入的数据量无关,只与要查询的字符串的长度有关。举例来说,这种数据结构的节点可以只包括两个变量{isWorld 和 next}...

2019-03-01 18:11:03 712

原创 线段树

线段树:线段树的特点是一般是处理固定大小数组的逻辑,比如指定大小区间的和或者求指定区间内数值的最大值。时间复杂度为O(logn)。如果用循环遍历的话,时间复杂度将会是O(n)。这种数据结构的特点是需要比所需节点更多的内存空间,因为对于树来说,最好的是满二叉树,但是此时只能达到平衡二叉树,所有的叶子节点是数组中的数值。有可能需要一层,也有可能需要两层,所以只能按照两层的树结构进行设计。这个时候需要的...

2019-02-28 20:53:26 126

原创 二叉搜索树

二叉搜索树:二叉搜索树的数据结构特点是一个父节点的左孩子都比这个父节点的值要小,右孩子节点上的值都比这个父节点的值要大。二分搜索树的常用遍历方法有前序遍历,中序遍历,后序遍历。如果用递归的方法进行遍历的话,就是输出语句在递归前的位置,因为如果用递归的话,每个节点都会访问三次,而不同的遍历方式就是在第几次访问这个节点时进行输出。中序遍历其实就是按照从小到大的顺序进行输出。一个完全二叉搜索树的排序的时...

2019-02-28 12:35:03 111

原创 二叉堆--优先队列

堆:堆常见的二叉堆,这种数据结构有大根堆和小根堆。对于大根堆来说,每个父节点是大于他的两个孩子节点的。也就是最大值在根节点。小根堆与之相反。如果堆用数组实现的话,如果从0开始计数,那么一个孩子的父节点是(i-1)/2;如果知道了父节点,而左孩子的节点位置为 i2+1,右孩子节点的位置为 i2+2。如果想加入一个节点,只需要加入到最后一个位置,然后向上组件大根堆。我们称之为siftup。判断的结束条...

2019-02-27 21:26:17 214

原创 递归

递归:递归其实就是函数的调用,只不过其调用的是本身自己的这个函数。然后递归就是将问题进行分解(也就是找到可以进行递归的规律),分解到更容易的步骤上,也就是分解到要求解问题的最基本的步骤(也就是递归的出口),这个时候就是需要写问题的基本处理步骤了。例如求斐波那契数列时,后一个数是前两个数的和。这个时候就可以分解为F(n) = F(n-1)+F(n-2);同样F(n-1)也是这种算法,就可以递归下去...

2019-02-27 15:30:44 91

原创 集合(Set)和映射(Map)

集合:集合是这样一种数据结构,里面存储的元素都是唯一的。当然也存在多重集合。集合的底层实现可以利用链表,也可以利用二叉搜索树。利用链表的话,因为每次存入元素的时候都得进行一次遍历操作来查询此元素是否已经存在了,所以时间复杂度是O(n)。但是如果利用二叉搜索树的话,最好的情况是满二叉树,所以此时树的深度为h = log2(n+1);此时时间复杂度已经降到了log(n)级别。如果数据量特别大的话,比如...

2019-02-26 21:27:30 271

原创 栈和队列

栈:栈这种数据结构的特点是后进先出(LIFO),这个特点被应用到了计算机领域的很多地方,例如编辑文档时的撤销键,函数的调用,括号的匹配等。栈的底层实现可以是数组(动态数组),可以是链表。...

2019-02-26 15:09:34 101

原创 数组和链表

数组就是用一组连续的存储空间来存储数据,所以数组可以进行数据的随机存取,只需要通过索引值。链表和数组存在着不同,链表的每个节点不仅要存储要存储的数据,而且还要存储下一个节点的位置,正是通过位置的连接才使数据连在一起,这个特点也造就了链表没法像数组那样进行数据的随机存取。动态数组:直接定义数组的话数组的大小是固定的,没法做到根据实际情况来创建合适大小的数组。所以需要创建动态数组(以Java为例)...

2019-02-26 14:50:16 79

原创 线性回归和 logistic回归算法原理推导

线性回归是机器学习的入门基础。在机器学习中,主要分类两类:回归和分类。而线性回归属于回归,虽然logistics回归名字带有回归,其实这个模型完成的分类任务。简单的理解回归和分类,其实就是回归的输出是一个具体的数值,而回归的输出是一个特定的类别。线性回归:    (1)这里的theta 是个矩阵,代表的是样本特征的系数,X代表的是样本的特征。代表的是误差项。这个误差项独立同分布的。服从标...

2018-08-09 19:57:24 1378

原创 关于机器学习的Numpy

本文主要介绍一下在机器学习上经常会用到的Numpy的一些知识。供刚入门的研究者参考。 Numpy的数据格式 import numpy as npnum1 = np.array([1,2,3,4,5])print(type(num1))print(num1)print(num1.shape)输出为:<class 'numpy.ndarray'> [1...

2018-08-08 11:34:24 288

空空如也

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

TA关注的人

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