![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
杨鲜生
纸上得来终觉浅,绝知此事要躬行。
展开
-
折半查找
折半查找又叫二分查找,从中间开始查找,这个适用于有序的数据表。听别人说一个面试官,给面试者10次机会,猜他想到的一个词。这个也是用到了折半查找的思想(应该都玩过这个游戏吧,你问别人问题,别人只能回答是或者不是,是生物吗,能走路吗,有羽毛吗。。。),想想也没有那么难。// 非递归折半 int binary_search(int search_table[],int key) {原创 2017-04-14 10:11:11 · 1235 阅读 · 0 评论 -
php 实现 strToInt
将一个字符串转换成一个整数的功能,但是string不符合数字要求时返回0,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。function StrToInt($str){ $flag = 1;//判断正负数,默认为正数 $number = 0; if(strlen($str)==0){ return 0; ...原创 2018-10-11 12:58:56 · 613 阅读 · 0 评论 -
php实现2-bitmap
1.前言先说一下什么是2-bitmap,为每个数分配2bit,00表示没有出现过,01表示出现过1次,10表示出现过2次及以上,11表示无意义。下面有个需求,求出一个数组中出现过一次的数字,显然用bitmap是无法实现的,位图法只能判断出是否出现过,但是只出现过一次是无法确定的,用2-bitmap正好能解决这种情况。2.数据结构既然连个bit表示一个数字,则能容纳的数字个数就是bitmap的一半插...原创 2018-05-12 18:26:21 · 1147 阅读 · 0 评论 -
1-999中求出重复的一个数
题干:一共1000个数(无序),大小1-999,其中有一个数是重复的,求出这个数这个题用到了异或(^),异或的用法:两个相同的数按位异或结果为0,任何数和零按位异或结果为这个数本身所以这道题可以用这个数组和1-999这个数都异或,最后的结果就为要求的数。举个例子,比如这个数组就是[1,2,3,4,5,5,6,7,8,9...999]和[0,1,2,3,4,5,6,7,8,9...999]数组按位异...原创 2018-05-18 18:10:40 · 559 阅读 · 1 评论 -
php实现位图法,处理海量数据
1.前言我们知道一个1G=1024M,1M=1024K,1K=1024byte,1byte=8bit,所以1个字节等于8bit,也就是8个二进制位,位图法的概念是用一个位(bit)来标记某个数的存放状态,所以节省了大量的空间。2.数据结构unsigned int bit[N],在这个数组里面,可以存储N*PHP_INT_SIZE*8个数据,但是最大的数只能是N*PHP_INT_SIZE*8-1。例...原创 2018-05-10 22:30:39 · 1919 阅读 · 0 评论 -
php实现归并排序
1.概念归并排序是建立在归并操作上的一种有效的排序算法,该算法是分治法的一个典型应用。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,在使子序列段间有序。若将两个有序表合并为一个有序表,称为二路归并。2.图解如图,从下往上,每一步都需将两个已经有序的子序列合并成一个大的有序数组3.代码实现//合并两个有序数组function merge(&$arr, $low, $mid...原创 2018-02-03 16:27:24 · 270 阅读 · 0 评论 -
php实现插入排序
1.插入排序的概念它是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其实这个我们并不陌生,举一个现实中的小例子,我们都打过扑克,拿到牌时,就需要对扑克进行抹顺,一般都是按着左右是从小到大的顺序,新来了一张牌,我们是不是一张一张的进行比较,找到它合适的位置,这就是插入排序。2.代码实现function InsertSort(&$arr){原创 2018-02-01 09:55:06 · 452 阅读 · 0 评论 -
php实现希尔排序
1.希尔排序的概念在上一篇中我讲到了插入排序(http://blog.csdn.net/u013252047/article/details/79222503),希尔排序就是在插入排序上做了点变动。那为什么出现希尔排序呢?上一篇中我也讲到了,当初始序列无序时,插入排序每次只能将数据移动一位,效率较低,当初始序列基本有序时,直接插入只需经过少量的比较即可完成排序。于是就出现了希尔排序。希尔排序的原创 2018-02-01 16:42:02 · 309 阅读 · 0 评论 -
php实现快速排序
1.快速排序的概念随机找出一个数(通常就拿数组的第一个数就行),把它插入一个位置,使得它左边的数都比它小,右边的数都比它大,这样就将一个数组分成了两个子数组,然后在按照同样的方法把子数组分成更小的子数组,直到不能分解为止。用比较通俗的话:挖坑填数+分而治之。2.图解分析取第一个数作为基准数,这是low=0,high=8,target=arr[0]=12,由于已经将arr[0]保原创 2018-02-02 16:29:34 · 4945 阅读 · 2 评论 -
按位与、或、异或等的相关操作
按位与运算符(&)参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。另外负数按补码形式参加按位与运...原创 2017-10-15 17:29:17 · 261 阅读 · 0 评论 -
求一个数二进制中1的个数
剑指offer中有一道题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:这个数的二进制减1,然后和这个数求”与“,再减1,和上一个数求“与”,直到为0,减了1的个数就是这个数二进制的1的个数。例如:21的二进制位10101,减1之后为10100,10101&10100=10100,10100减1为10011,10100&10011=10000,10000减1...原创 2017-10-15 14:21:53 · 772 阅读 · 0 评论 -
剑指offer之查找
剑指offeroffer中有这样一道题,把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。初看这道题没有思路,而且也没有想到用二分法,看了解析,明白了,可以和以前学的二原创 2017-09-22 17:42:52 · 193 阅读 · 0 评论 -
冒泡排序之升华版
1.冒泡算法是依次比较两个相邻的位置,如果不符合规则,则交换,比较完这一趟后,在接着比较下一趟。用程序实现是这样的public static void main(String[] args) { int[] arr = new int[]{3,2,1,7,8,9}; maoPao(arr);} public static void maoPao(int[] ar原创 2017-06-28 11:24:14 · 243 阅读 · 0 评论 -
求无序数组中第k大的数
如果是排好序的数组,则比较简单,直接$arr[$k-1]就能求出,如果不是排好序的就需要先排序,但这种时间复杂度为O(n2),所以不能直接排序。我们知道快速排序就是找一个哨兵,使左边的数比它大,右边的数比它小,然后在对左右两边的数重复上次的动作。可以利用快速排序中的步骤,找的哨兵,在排完一步的序后,如果等于$k,则这个位置就是要找的,如果小于哨兵的位置,则重新对哨兵左边的数进行排序就好,没必要在对...原创 2018-10-08 11:09:00 · 2477 阅读 · 0 评论