随笔分类 -  算法

摘要:计划最近好好按步骤按阶段系统性的学习下机器学习和深度学习,希望能坚持下去。 2019 01 05 "基于TensorFlow的深度学习系列教程 2——常量Constant" 2019 01 03 "深度学习Tensorflow生产环境部署(下·模型部署篇)" 2019 01 03 "深度学习Tens 阅读全文
posted @ 2018-06-07 22:05 xingoo 阅读(5080) 评论(0) 推荐(2) 编辑
摘要:从事推荐系统已经快一年了,遇到过很多的茫然不知所措,也踩过不少坑,索性把所有推荐的资料都汇总一下,希望给新人以指引,或者给老司机作为归纳总结 如果电子书链接失效,可以私信我 算法基础 博客整理 业界参考 推荐文章 书籍推荐 算法基础 对于推荐系统是需要一些数学和机器学习的基本功的,假设你从来没有接触 阅读全文
posted @ 2018-02-01 11:05 xingoo 阅读(6659) 评论(0) 推荐(4) 编辑
摘要:核心代码:public void bubbleSort(){ for(int i=0;ia[j+1]) swap(j,j+1); } } } public void swap(int indexa,i... 阅读全文
posted @ 2014-07-05 23:19 xingoo 阅读(1452) 评论(3) 推荐(2) 编辑
摘要:平衡二叉树,是一个方便查找的树,树的左子树深度与右子树的深度的差总(BF)是在+1,0,-1之中。随着树的建立,插入,树都会自动的进行调整,使得其满足上面的条件。1、+1表示左子树的深度比右子树的深度多1.2、0 表示左子树的深度与右子树的深度相同。3、-1表示左子树的深度比右子树神的小1.因此,如... 阅读全文
posted @ 2014-04-21 17:02 xingoo 阅读(998) 评论(0) 推荐(0) 编辑
摘要:快速排序时间复杂度为O(nlogn),由于是在原数组上面利用替换来实现,因此不需要额外的存储空间。算法思想: 通过设置一个岗哨,每次跟这个岗哨进行比较,比他小的放在左边,比他大的放在右边。再对岗哨左边的数组0----middle-1,和middle+1-----end,进行同样的排序。主要代码:v... 阅读全文
posted @ 2014-04-21 14:42 xingoo 阅读(886) 评论(0) 推荐(2) 编辑
摘要:非递归版的归并排序,省略了中间的栈空间,直接申请一段O(n)的地址空间即可,因此空间复杂度为O(n),时间复杂度为O(nlogn);算法思想: 开始以间隔为1的进行归并,也就是说,第一个元素跟第二个进行归并。第三个与第四个进行归并; 然后,再以间隔为2的进行归并,1-4进行归并,5-8进行归并;... 阅读全文
posted @ 2014-04-17 19:57 xingoo 阅读(12377) 评论(1) 推荐(4) 编辑
摘要:递归版的合并排序,时间复杂度为O(nlogn),空间复杂度为O(n+logn);算法思想: 利用分而自治的思想,把排序分成两块,每块内部排序,再进行一次遍历排序即可,递归调用此过程即可。主要代码:void MergeSort(int *arr,int length){ Msort(arr,a... 阅读全文
posted @ 2014-04-17 16:53 xingoo 阅读(1826) 评论(0) 推荐(0) 编辑
摘要:构建堆的时间复杂度为O(n),而第I次调整堆的时间复杂度为O(logi),因此,无论什么情况下时间复杂度都为O(nlogn)。算法思想: 首先,对数组从n/2处开始进行创建堆。大顶堆就是顶点总是大于它的子节点,而小顶堆就是定点总是小于它的子节点。 因此,构建时,对节点与他的孩子进行比较,如果创建... 阅读全文
posted @ 2014-04-14 17:34 xingoo 阅读(519) 评论(0) 推荐(0) 编辑
摘要:希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。主要程序:void shellSort(int *... 阅读全文
posted @ 2014-04-14 15:03 xingoo 阅读(576) 评论(0) 推荐(0) 编辑
摘要:时间复杂度:如果排序的数组是正序的,那么时间复杂度相当于O(n),而如果排序是随机的,时间复杂度相当于O(n^2/4).倒置的时间复杂度是最高的,O(n^2).算法思想: 该算法是设置了一个中间存储,每次读到的数据存储到中间值。向前遍历,如果大于这个值,继续向前,每次向前遍历时,把数据向后移,最后... 阅读全文
posted @ 2014-04-14 08:52 xingoo 阅读(509) 评论(0) 推荐(0) 编辑
摘要:选择排序时间复杂度也为O(n^2)算法思想:选择排序即每次length-i的长度内选择一个最小的元素,与第一个进行替换,这样大循环length次后,就可以得到排好序的数组了。主要代码:void selectSort(int *arr,int length){ int i,j,k,min; for(i=0;i#include int arrtest[10] = {3,4,7,8,0,9,1,2,6,5};//int arrtest[10] = {0,1,2,3,4,5,6,7,8,9};//int arrtest[10] = {9,8,7,6,5,4,3,2,1,0};void co... 阅读全文
posted @ 2014-04-09 16:44 xingoo 阅读(330) 评论(0) 推荐(1) 编辑
摘要:冒泡排序时间复杂度上为O(n^2)冒泡排序三种方式,第一种也是最基本的排序:void bubbleSort1(int *arr,int length){ int i,j,k; for(i=0;iarr[j]){ k = arr[j]; arr[j] = arr[i]; arr[i] = k; } } }}第二种是循环的时候,j指针从尾部开始,每次可以顺便排序其他的元素void bubbleSort2(int *arr,int length){ i... 阅读全文
posted @ 2014-04-09 16:29 xingoo 阅读(894) 评论(0) 推荐(0) 编辑
摘要:算法思想二叉排序树,删除操作主要针对三种情况。1 叶子节点-直接删除就可以了2 没有左孩子的节点-直接嫁接右子树就可以了(没有右孩子的节点-直接嫁接左子树就可以了)3 如果左右子树都存在,则寻找删除节点的直接前驱(即左子树里面的最右的节点)编程时需要注意,函数时针对指针的操作,因此为了修改指针,要使用二级指针传参才可以例如:void delete(BinaryTree **b){ ....}int main(){ BinaryTree *b = (BinaryTree *)malloc(sizeof(BinaryTree)); delete(&b);}函数代码:bool deleteT 阅读全文
posted @ 2014-04-09 15:37 xingoo 阅读(3235) 评论(0) 推荐(0) 编辑
摘要:二叉排序树,是一种规整的二叉树。每个节点的左子树都小于他,每个节点的右子树都大于他。二叉树的遍历:void InOrderTree(BTree *b){ if( !b ) return; InOrderTree(b->lchild); printf("%d ",b->data); InOrderTree(b->rchild);}二叉树的查找:int searchTree(BTree *b,int key,BTree *f,BTree *&p){ if(!b){ p = f; return 0; } else i... 阅读全文
posted @ 2014-04-08 16:56 xingoo 阅读(538) 评论(0) 推荐(0) 编辑
摘要:这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。从而算出活动最早开始的时间和最晚开始的时间,如果这两个时间相等,则为关键路径。时间复杂度为O(n+e)主要算法:int topSort(Graph *g){ EdgeNode *e; int i,k,gettop; int top = 0 ; int count = 0; int *stack; stack = (int *)malloc(g->numVertexes * sizeof(int)); for(i=0;inumVertexes;i++)... 阅读全文
posted @ 2014-03-31 20:06 xingoo 阅读(1552) 评论(0) 推荐(0) 编辑
摘要:这个算法,主要是为输出一个无环图的拓扑序列算法思想:主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入度为零的节点,就加入到栈中。参考《大话数据结构》,写下下面完整代码,并发现,其中程序的进行,出现错误。v6执行完,应该执行v9,因为此时v9是站顶元素,并不是v0.算法流程:int topGraph(graph g){ EdgeNode *e; int i,k,gettop; int top = 0 ; int count = 0; int *stack; stack = (int *)malloc(g-... 阅读全文
posted @ 2014-03-23 10:37 xingoo 阅读(2920) 评论(0) 推荐(0) 编辑
摘要:另一个求解最短路径的经典算法是Floyd,时间复杂度为O(n^3),所以如果只求一个点到另一个点的最短路径,应该用Dijkstra算法,时间复杂度为O(n^2)。如果要求全部的最短路径,还是推荐Floyd,因为代码更简单,更整洁:核心代码主要就是通过简单的思路,如果借由中间节点的路径要小于直达的费用,那么就替换中间节点为路径中间量if(D[i][j] > D[i][k]+D[k][j]) D[i][j] = D[i][k] + D[k][j];全部代码 1 #include 2 #include 3 #define MAXSIZE 9 4 #define INF 65535 5 in.. 阅读全文
posted @ 2014-03-19 16:35 xingoo 阅读(523) 评论(0) 推荐(0) 编辑
摘要:迪杰斯特拉算法是典型的求解最短路径的方法。优点,时间复杂度为O(n2),主要思想就是遍历邻居,找到路径最短的邻居,添加到路径信息里面。再更新这个添加点,是否能减少到其他点的路径长度。但是有一个缺点,就是这个算法只满足一个节点的扫描信息,如果想计算所有的节点到达其他节点的最短路径,就需要每次调用一次该算法。时间复杂度变为O(n3).总体来说,分为两部分第一部分:查找当前节点周围的最近的邻居;min = INF; for(j=0; j 2 #include 3 #define MAXSIZE 9 4 #define INF 65535 5 int num[MAXSIZE][M... 阅读全文
posted @ 2014-03-12 21:16 xingoo 阅读(603) 评论(0) 推荐(0) 编辑
摘要:同样是求最小生成树,kruskal适合从边的角度出发,因此适合稀疏图。而prim算法从点的角度出发,适合稠密图。时间复杂度为O(eloge)。因为外层循环了e(边数)层,而内部find循环了loge层。算法首先把二维矩阵图转化为边图 for(i=0;ie[k].begin == j && g->e[k].end == i){ flag = 0; break; } } ... 阅读全文
posted @ 2014-03-10 18:10 xingoo 阅读(1436) 评论(0) 推荐(0) 编辑
摘要:书中本意是想省略后端顺序表中无用的查找,但是忽略了一个问题。原书中代码大意为:void bubblesort(Graph *g,int len){ int i,j; int flag = 1; for(i=0; i i; j--){ if(g->e[j].length e[i].length){ swap(g,i,j); printf("%d %d \n",i,j); flag = 1; } } } ... 阅读全文
posted @ 2014-03-10 17:53 xingoo 阅读(804) 评论(0) 推荐(0) 编辑

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