随笔分类 -  算法

摘要:两阶段提交协议(two phase commit protocol,以下简称2PC协议)作为最简单原子提交协议,在很多需要使用分布式事务的场景中会经常用到。下面将尝试深入而简单的阐释2PC协议,并给出一个简单的demo实现。 2PC协议中的两种角色 2PC协议中存在着一个协调者(Coordinato 阅读全文
posted @ 2019-02-14 22:30 segeon 阅读(1525) 评论(0) 推荐(0)
摘要:线性方程组问题可以利用矩阵变换求解。利用高斯消元法,将矩阵转换成一个行阶梯矩阵,最后得到一个简化行阶梯矩阵,就是方程的解。参考资料(高斯消元法) Java代码 复杂度分析 该算法的时间复杂度为O(n^3),空间复杂度为O(n^2)。对于维度不高的线性方程还是可以接受。 阅读全文
posted @ 2019-02-14 22:25 segeon 阅读(2447) 评论(0) 推荐(0)
摘要:又一个经典问题,貌似很多公司笔试都考过这个问题的非递归程序求解。下面是我的递归与非递归程序,个人感觉程序逻辑还是比较清晰:)。int board[8][8];int cnt = 0;bool isValid(int i, int j){ int k; for(k = 0; k < 8; ++k) if(k != j && board[i][k]) return false; for(k = 0; k < 8; ++k) if(k != i && board[k][j]) return false; for(k = 1; k < 8 && 阅读全文
posted @ 2012-10-06 10:07 segeon 阅读(1256) 评论(0) 推荐(0)
摘要:问题描述:已知一个整数数组a[],其长度为n,要找出数组中相邻元素的最大间距。分析:问题很简单,而且描述本身就暗示了一种自然的求解方法,即先对元素排序,然后逐个求相邻元素的间距。这种解法的复杂度为O(n*logn)。再想一下,设min, max分别是数组中的最小和最大元素,len =(max-min... 阅读全文
posted @ 2012-09-15 11:53 segeon 阅读(2991) 评论(2) 推荐(0)
摘要:算法思想:利用向量叉积性质判断点和三角形边的相对位置关系。需要注意的是,在计算叉积之前需要先将三个顶点按顺时针或者逆时针方向排好序。叉积相关概念和性质参见:http://hi.baidu.com/zhubingn/item/cb63083e987b8cad134b14abhttp://en.wikipedia.org/wiki/Cross_product代码如下:#include <stdlib.h>#include <stdio.h>typedef struct _Point{ int x, y;}Point;void swap(Point *p1, Point *p 阅读全文
posted @ 2012-08-28 11:09 segeon 阅读(247) 评论(0) 推荐(0)
摘要:前两天在复习数据结构二叉树部分的时候,看到当初在书上写的一个问题:怎么能找出和一个前序序列对应的所有可能的中序序列,问题末尾有一个大大的问号,想必当时自己肯定没想明白。今天重新想了一下,这个问题相当于求一个给定入栈序列所有可能的出栈序列,用回溯的方法来做。算法的基本思想:模拟一系列入栈出栈的过程,对于每一步操作,可能是入栈,也可能是出栈;如果所有元素都已入栈,那就将栈中元素都弹出,这就找到一个中序序列。代码如下:/* * root是前序序列,l表示入栈的第几个字符,stack,top不用说了,inTree用来保存当前得到的中序序列 */void inorderTrees(char *root, 阅读全文
posted @ 2012-08-07 10:22 segeon 阅读(1185) 评论(0) 推荐(0)
摘要:很多书上都会讲到二分查找(数据结构与算法教材、《编程之美》、《编程珠玑》),这也是一个经典的面试题。尽管它很常见,大家也很熟悉,但是却不一定能够完美地写出来。今天自己整理了一下,把三种二分查找算法(找最后一次出现的某值v,找第一次出现的某值v和普通的二分查找)进行了梳理。问题描述:有一个按非降序排列的有序数组a[0...n-1]和一个数v1. 求数组a中最后一次出现的数v的下标设l为左边界,h为右边界,mid = (l+h)/2,那么,根据mid的取值,分三种情况:(1) a[mid] < v,说明v如果在数组中,应该出现在mid右侧,则调整左边界,l = mid + 1(2) a[mi 阅读全文
posted @ 2012-07-27 19:22 segeon 阅读(2067) 评论(0) 推荐(0)