随笔分类 -  数据结构与算法之美

大数乘法 - 逐位与移位算法
摘要:逐位相乘处理进位法 乘积是逐位相乘,也就是aibjaibj,结果加入到积c的第i+j位,最后处理进位即可: 举例: 因此,思路是: 字符串反转; 逐位相乘,结果存放在v[i+j]中; 处理进位,结果存放在v[i+j]中; 将计算结果转换为字符串并反转。 C++代码: C++代码详解(代码和上面相同, 阅读全文

posted @ 2019-08-09 15:58 zkfopen 阅读(477) 评论(0) 推荐(0) 编辑

快速幂取模
摘要:快速幂取模就是在O(logn)内求出an mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c 设计一个基于二分的递归算法 C++代码: 证明:ab mod c=(a mod c)(b mod c)mod c 假设 a = Ac + B; b = Cc + D 阅读全文

posted @ 2019-08-08 19:43 zkfopen 阅读(303) 评论(0) 推荐(0) 编辑

斐波那契数列 --- 四层优化
摘要:斐波那契数列 起源 兔子问题:“假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问一年后共有多少对兔子?” 分析:第一个月兔子没有繁殖能力,所以还是一对;两个月后生下一对兔子,共有两对;三个月后,老兔子生下一对,小 阅读全文

posted @ 2019-07-25 17:50 zkfopen 阅读(22179) 评论(1) 推荐(2) 编辑

C++堆排序算法的实现
摘要:堆排序(Heap sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以用到上一次的排序结果,所以不像其他一般的排序方法一样,每次都要进行n-1次的比较,复杂度为O(nlogn)。 这 阅读全文

posted @ 2019-07-15 22:09 zkfopen 阅读(10685) 评论(0) 推荐(1) 编辑

冒泡排序(及改进版)
摘要:冒泡排序 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。 算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的 阅读全文

posted @ 2019-07-15 18:05 zkfopen 阅读(1538) 评论(0) 推荐(0) 编辑

使用函数rand5()来实现函数rand7()
摘要:题目: 题目: 给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数。 思路: 很多人的第一反应是利用rand5() + rand()%3来实现rand7()函数,这个方法确实可以产生 阅读全文

posted @ 2019-07-15 11:26 zkfopen 阅读(6274) 评论(0) 推荐(0) 编辑

C++二叉树前中后序遍历(递归&非递归)统一代码格式
摘要:统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理。 三种递归格式: 前序遍历: 中序遍历: 后序遍历: 三种递归遍历不用多解释。 三种非递归格式: 前序遍历: 中序遍历: 后序遍历: 以上三种遍历实现代码行数一模一样,如同递归遍历一样,只有三行核心代码的先后顺序有区别。 解释下三种非递归 阅读全文

posted @ 2019-07-13 17:02 zkfopen 阅读(2418) 评论(0) 推荐(0) 编辑

反转链表和反转链表2
摘要:LeetCode 206. Reverse Linked List Reverse a singly linked list. Example: Follow up: A linked list can be reversed either iteratively or recursively. C 阅读全文

posted @ 2019-07-12 16:08 zkfopen 阅读(369) 评论(0) 推荐(0) 编辑

基于partition的递归
摘要:partition算法可以应用在快速排序算法中,也可以应用到 Selection algorithm(在无序数组中寻找第K大的值) Partition 实现 快速排序中用到的 partition 算法思想很简单,首先从无序数组中选出枢轴点 pivot,然后通过一趟扫描,以 pivot 为分界线将数组 阅读全文

posted @ 2019-07-12 11:56 zkfopen 阅读(451) 评论(0) 推荐(0) 编辑

C++归并排序(数组&链表)
摘要:1、归并排序(Merge Sort) 归并排序的性能不受输入数据的影响,始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。 阅读全文

posted @ 2019-07-11 21:30 zkfopen 阅读(1783) 评论(0) 推荐(0) 编辑

从n个数里面找最大的两个数理论最少需要比较
摘要:答案是:n+logn-2 过程是这样的: 甲乙比甲胜出,丙丁比丙胜出,最后甲丙比较,甲胜出。。。容易得出找出最大数为n-1次。 现在开始找出第二大的数字:明显,第二大的数字,一定和甲进行过比较。。。。如图中可能是丙、乙,得出一个规律:除了第一层外,每一层都有一个数字和甲进行过比较,那么n个节点,一共 阅读全文

posted @ 2019-05-07 21:40 zkfopen 阅读(1055) 评论(0) 推荐(0) 编辑

排序算法之快速排序QuickSort
摘要:挖坑填数-快速排序 1. left = L,right = R;将基准数挖出形成第一个坑s[left]; 2. right --; 由后向前找比它小的数,找到后挖出此数填前一个坑s[left]中。 3. left ++; 由前向后找比它大的数,找到后挖出此数填前一个坑s[right]中。 4. 重复 阅读全文

posted @ 2019-04-04 14:09 zkfopen 阅读(449) 评论(0) 推荐(0) 编辑

字符串的全排列和组合算法
摘要:转:字符串的全排列和组合算法 阅读全文

posted @ 2019-04-01 21:16 zkfopen 阅读(498) 评论(0) 推荐(0) 编辑

哈希表
摘要:1.哈希表的定义 哈希表:根据关键码值(key value)直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度,这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字 阅读全文

posted @ 2019-03-27 21:01 zkfopen 阅读(933) 评论(0) 推荐(0) 编辑

常用数据结构
摘要:复习下数据结构基础 线性表:由零个或多个数据元素组成的有限序列。 数组:在我们程序设计中,为了处理方便,会把一些具有相同类型的元素有序的放在一起,这些有序排列的数据元素的集合成为数组。 栈:栈是只能在一端插入或删除的特殊线性表,先入栈的数据在栈底,后入栈的数据在栈顶,需要读取数据时,最先获取到的是栈 阅读全文

posted @ 2019-03-25 16:00 zkfopen 阅读(289) 评论(0) 推荐(0) 编辑

导航

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