![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 78
NK_test
大部分人愿意做任何事来逃避真正的思考
展开
-
使用不带头结点的循环链表实现队列(数据结构)
我使用类模版来完成循环链表实现队列的操作。首先定义一个结点类node用来保存结点信息,然后定义队列类Queue,接下来我们思考:要完成队列的4个基本操作即1.判断队列是否为空2.在队列尾部push进数据3.从队列头部取出数据4.删除掉队列首部的元素我们这个Queue类需要什么成员变量?答案是: (维护)队列尾部结点、队列大小就够了。我们来分析,尾部push数据的时候,我原创 2015-08-24 23:22:39 · 6759 阅读 · 0 评论 -
操作系统: 银行家算法的分析和代码实现(c++语言)
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银原创 2015-12-11 23:00:30 · 13920 阅读 · 2 评论 -
最短路径算法Dijkstra && SPFA && Floyd 代码实现模板
本文建立在已经了解这三种算法基本思想的基础上,不再对算法进行详细的描述,而是对思想进行比较优秀的代码实现的总结,可以直接用于ACM题目或者实际问题的解决中。Dijkstra算法: Dijkstra算法是指定一个源点,求得这个源点到各个点的最短路径。Dijkstra算法通过不断的松弛边,并且进行记录,每次更新相邻点的路径,采用类似贪心的思想,使两点之间的距离成为最短的路径。原创 2015-10-08 23:35:44 · 1386 阅读 · 0 评论 -
C++ 大数版的加减乘除代码实现总结
1)大正整数的加法具体思路就是模仿手算的加法,我在这里先将输入的字符串reverse便于操作,最后去掉结果的前置0即可。注意:如果答案就是0,那么需要特殊处理。大量的测试数据可以 上交至hdu 1002[cpp] view plaincopy#include #include #include using n原创 2015-10-05 10:39:12 · 15001 阅读 · 1 评论 -
Trie树的常见应用大总结(面试+附代码实现)
(一)Trie的简介Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。他的核心思想是空间换时间,空间消耗大但是插入和查询有着很优秀的时间复杂度。(二)Trie的定义Trie树的键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀(prefix),从根节点到当前结点的原创 2015-08-21 16:18:45 · 11197 阅读 · 3 评论 -
主项定理Master Method 计算时间复杂度
在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们: T(n) = a * T(n/b) + f(n) (a ³ 1,b > 1,f(n)一般是个简单函数)这样的递归方程,计算其时间复杂度。这时可以有2种方法,来计算时间复杂度。一是用递归树,逐层代入原式,最终形成一个级数,然后用一个函数来表达,得到T(n)。(我们这里主要讨论第二种方法,递归树详见 http://ww原创 2015-09-09 20:49:35 · 7645 阅读 · 0 评论 -
欧拉线性筛法求素数(顺便实现欧拉函数的求值)
我们先来看一下最经典的埃拉特斯特尼筛法。时间复杂度为O(n loglog n)int ans[MAXN];void Prime(int n){ int cnt=0; memset(prime,1,sizeof(prime)); prime[0]=prime[1]=0; for(int i=2;i<n;i++) { if(vis[i]) { ans[cnt++]=原创 2015-05-29 23:02:16 · 18909 阅读 · 4 评论 -
0-1背包打印路径(递归和非递归版本)
简单的0-1背包打印路径问题,我们可以记录一个p[][]数组来判断,当前物品是否被选中,最后按照记录输出,注意是逆序。#include #include int main() { int a[25],p[25][10005],i,j,n,m,s[10005]; while(scanf("%d%d",&m,&n)!=EOF){ for(i=原创 2015-08-30 23:44:14 · 2016 阅读 · 0 评论 -
线段树为什么要开四倍空间
转自: http://scinart.github.io/acm/2014/03/19/acm-segment-tree-space-analysis/最近在看《具体数学》,这篇当做是一个练习吧。假设我们用一个数组来头轻脚重地存储一个线段树,根节点是1,孩子节点分别是2n, 2n+1, 那么,设线段长为L(即[1..L+1))设树的高度为H,对H,有:H(L)=转载 2015-05-12 16:31:49 · 2642 阅读 · 0 评论 -
线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
对于线段树的讲解此篇不再赘述,下面列出线段树应用中最常用的几种操作的代码。(具体题目未贴出,仅供有一定基础者参考代码风格)另外,注意多组输入要写scanf("%d%d",&n,&m)!=EOF,线段树的题肯定要用c语言的输入输出,要使用字符数组,不用字符串,输入字符的时候要加getchar()吞噬空行..(1)单点增减,区间求和:#include#include#include#原创 2015-08-09 18:37:11 · 3451 阅读 · 1 评论 -
单链表的反转(数据结构 面试题)
编写一个算法来颠倒一个链表,该链表的第一个结点由first指向。不要复制列表元素;而是重置链接和指针,使得first指向原来的最后一个结点,并且结点之间的所有链接都反向。思路:因为题目中明确说明不能复制元素,所以通过复制来重置另外一个链表的想法被终止。我们想到,如果要改变连接的指向,又能够要使链表继续遍历,那么最少需要先遍历到几个结点呢?答案是3个。如图:(第二张是将要结束时的情况)原创 2015-08-25 23:26:55 · 1599 阅读 · 0 评论 -
2016小米在线编程题解
题目一世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?思路:很简单啊,异或操作,然后右移算出1的个数。class Solution {public: /** * 获得两个整形二进制表达位数不同的数量 * * @param m 整数m * @param n 整数n *原创 2016-10-21 12:57:13 · 2184 阅读 · 0 评论