㈠ acm竞赛知识点
1. acm常用小知识点
acm常用小知识点 1.ACM 关于ACM程序设计竞赛,需要掌握哪些知识点,最好能详细一
训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上。
下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简) 7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多,慢慢掌握. 9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。
如: 1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树,二进制法等。
7.最大团,最大独立集。 8.判断点在多边形内。
9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.第三阶段: 前两个阶段是打基础,第三阶段是锻炼在比赛中可以快速建立模型、想新算法。这就要平时多做做综合的题型了。
1. 把oibh上的论文看看(大概几百篇的,我只看了一点点,呵呵)。 2. 平时扫扫zoj上的难题啦,别老做那些不用想的题.(中大acm的版主经常说我挑简单的来做:-P ) 3. 多参加网上的比赛,感受一下比赛的气氛,评估自己的实力. 4. 一道题不要过了就算,问一下人,有更好的算法也打一下。
5. 做过的题要记好 :-)下面转自:ACMer必备知识(任重而道远。)
图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配 最优匹配 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定组合数学 解决组合数学问题时常用的思想 逼近 递推 / 动态规划 概率问题 Polya定理计算几何 / 解析几何 计算几何的核心:叉积 / 面积 解析几何的主力:复数 基本形 点 直线,线段 多边形 凸多边形 / 凸包 凸包算法的引进,卷包裹法 Graham扫描法 水平序的引进,共线凸包的补丁 完美凸包算法 相关判定 两直线相交 两线段相交 点在任意多边形内的判定 点在凸多边形内的判定 经典问题 最小外接圆 近似O(n)的最小外接圆算法 点集直径 旋转卡壳,对踵点 多边形的三角剖分数学 / 数论 最大公约数 Euclid算法 扩展的Euclid算法 同余方程 / 二元一次不定方程 同余方程组 线性方程组 高斯消元法 解mod 2域上的线性方程组 整系数方程组的精确解法 矩阵 行列式的计算 利用矩阵乘法快速计算递推关系 分数 分数树 连分数逼近 数论计算 求N的约数个数 求phi(N) 求约数和 快速数论变换 …… 素数问题 概率判素算法 概率因子分解数据结构 组织结构 二叉堆 左偏树 二项树 胜者树 跳跃表 样式图标 斜堆 reap 统计结构 树状数组 虚二叉树 线段树 矩形面积并 圆形面积并 关系结构 Hash表 并查集 路径压缩思想的应用 STL中的数据结构 vector deque set / map动态规划 / 记忆化搜索 动态规划和记忆化搜索在思考方式上的区别 最长子序列系列问题 最长不下降子序列 最长公共子序列 最长公共不下降子序列 一类NP问题的动态规划解法 树型动态规划 背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向线性规划常用思想 二分 最小表示法串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论排序 选择/冒泡 快速排序 堆排序 归并排序 基数排序 拓扑排序 排序网络。
2.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
3.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
4.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
5.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
6.ACM常用的经典算法
大概分为数论算法,图论算法,A*算法。
数论算法:
排序(选择,冒泡,快速,归并,堆,基数,桶排序等)
递归,回溯
概率,随机
公约数,素数
因数分解
矩阵运算
线性规划
最小二乘
微积分
多项式分解和级数
图论算法:
哈夫曼树(即最优二叉树)
哈希表
Prim,Kruskal算法(即最小生成树算法)
红黑树
a-B剪枝法
深、广度搜索
拓扑排序
强连通分量
Dijkstra,Bellman-Ford,Floyd-Warashall算法(最短路径算法)
计算几何(线段相交,凸包,最近点对)
A*算法:
动态规划
贪心算法
KMP算法
哈密顿回路问题
子集问题
博弈(极大极小值算法等)
7.参加ACM需要准备哪些知识
学ACM要熟练C语言的基础语法,对编程有很大的兴趣,还要学关于数据结构的知识。
内容大多数是考数据结构,例如:深度搜索(dfs)、广度搜索(bfs)、并查集、母函数、最小生成树、数论、动态规划(重点)、背包问题、最短路、网络流……还有很多算法,我列出这些是经常考到的,我也在学习上述所说的。 最好买一本《数据结构》或者关于算法的书看看,看完一些要自己动手实践做题,做题的话去杭电acm做题,里面有很多很基础的题,不错的。
资料的话,网络有很多,我多数都是网络或者 *** ,还有可以看看别人的博客的解题报告,里面有详细的介绍,不懂还可以问问同学师兄的。 对了,还有一点,acm比赛都是英文题目的,比赛时带本字典查吧。
希望我说的你能满意,祝你能在acm方面有所收获。
㈡ 数据结构面试常见问题
数据结构面试常见问题
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。下面就是我整理的数据结构面试常见问题,一起来看一下吧。
数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易。在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的燃银坦时候,要在很短的时间内考察一个人这方面的能力,把每种结构和算法都问一遍不太现实。所以,实际的情况是,企业一般考察一些看起来很基本的概念和算法,或者是一些变形,然后让你去实现。搏弯也许看起来简单,但是如果真让你在纸上或者是计算机上快速地完成一个算法,并且设计测试案例,最后跑起来,你就会发现会很难了。这就要求我们要熟悉,并牢固掌握常用的算法,特别是那些看起来貌似简单的算法,正是这些用起来很普遍的算法,才要求我们能很扎实的掌握,在实际工作中提高工作效率。遇到复杂的算法,通过分析和扎实的基本功,应该可以很快地进行开发。
闲话少说,下面进入正题。
一.数据结构部分
1.数组和链表的区别。(很简单,但是很常考,记得要回答全面)
C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用将已分配的空间释放,不会造成内存空间的浪费。
从逻辑结构来看:数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况,即数组的大小一旦定义就不能改变。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;链表动态地进行存储分配,可以适应数据动态地增减的.情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。
从内存存储来看:(静态)数组从栈中分配空间(用NEW创建的在堆中), 对于程序员方便快速,但是自由度小;链表从堆中分配空间, 自由度大但是申请管理比较麻烦.
1.从访问方式来看:数组在内存中是连续存储的,因此,可以利用下标索引进行随机访问;链表是链式存储结构,在访问元素的时候只能通过线性的方式由前到后顺序访问,所以访问效率比数组要低。
2.链表的一些操作,如链表的反转,链表存在环路的判断(快慢指针),双向链表,循环链表相关操作。
3.队列(特殊的如优先级队列),栈的应用。(比如队列用在消息队列,栈用在递归调用中)
4.二叉树的基本操作
二叉树的三种遍历方式(前序,中序,后序)及其递归和非递归实皮桐现,三种遍历方式的主要应用(如后缀表达式等)。相关操作的时间复杂度。
5.字符串相关
整数,浮点数和字符串之间的转换(atoi,atof,itoa)
字符串拷贝注意异常检查,比如空指针,字符串重叠,自赋值,字符串结束符'/0'等。
二.算法部分
1.排序算法:
排序可以算是最基本的,最常用的算法,也是笔试面试中最常被考察到的算法。最基本的冒泡排序,选择排序,插入排序要可以很快的用代码实现,这些主要考察你的实际编码能力。堆排序,归并排序,快排序,这些算法需要熟悉主要的思想,和需要注意的细节地方。需要熟悉常用排序算法的时间和空间复杂度。
各种排序算法的使用范围总结:
(1)当数据规模较小的时候,可以用简单的排序算法如直接插入排序或直接选择排序。
(2)当文件的初态已经基本有序时,可以用直接插入排序或冒泡排序。
(3)当数据规模比较大时,应用速度快的排序算法。可以考虑用快速排序。当记录随机分布的时候,快排的平均时间最短,但可能出现最坏的情况,这时候的时间复杂度是O(n^2),且递归深度为n,所需的栈空间问O(n)。
(4)堆排序不会出现快排那样的最坏情况,且堆排序所需的辅助空间比快排要少。但这两种算法都不是稳定的,若要求排序时稳定的,可以考虑用归并排序。
(5)归并排序可以用于内排序,也可以用于外排序。在外排序时,通常采用多路归并,并且通过解决长顺串的合并,产生长的初始串,提高主机与外设并行能力等措施,以减少访问外存额次数,提高外排序的效率。
2,查找算法
能够熟练写出或者是上机编码出二分查找的程序。
3.hash算法
4.一些算法设计思想。
贪心算法,分治算法,动态规划算法,随机化算法,回溯算法等。这些可以根据具体的例子程序来复习。
5.STL
STL(Standard Template Library)是一个C++领域中,用模版技术实现的数据结构和算法库,已经包含在了C++标准库中。其中的vecor,list,stack,queue等结构不仅拥有更强大的功能,还有了更高的安全性。除了数据结构外,STL还包含泛化了的迭代器,和运行在迭代器上的各种实用算法。这些对于对性能要求不是太高,但又不希望自己从底层实现算法的应用还是很具有诱惑力的。
1. 什么是数据结构?
数据结构是数据组织(存储)和操作进行检索和访问的方式。它还定义了不同数据集相互关联、建立关系和形成算法的方式。
2. 描述数据结构的类型?
列表:链接到先前或/和后续数据项的相关事物的集合。
数组:所有相同的值的集合。
Records:字段的集合,每个字段都包含来自单一数据类型的数据。
树:在分层框架中组织数据的数据结构。这种形式的数据结构遵循数据项插入、删除和修改的顺序。
表格:数据以行和列的形式保存。这些与记录相当,因为数据的结果或更改反映在整个表中。
3. 什么是线性数据结构?请举例
如果数据结构的所有元素或数据项都按顺序或线性顺序排列,则数据结构是线性的。元素以非分层方式存储,因此除了列表中的第一个和最后一个元素外,每个项目都有后继者和前驱者。数组、堆栈、字符串、队列和链表,都属于线性数据结构。
4. 数据结构有哪些应用?
数值分析、操作系统、人工智能、编译器设计、数据库管理、图形、统计分析和仿真。
5、文件结构和存储结构有什么区别?
区别在于访问的内存区域。存储结构是指计算机系统内存中的数据结构,而文件结构是指辅助存储器中的存储结构。
6、什么是多维数组?
多维数组的意思是指三维或者三维以上的数组。 三维数组具有高、宽、深的概念,或者说行、列、层的概念,即数组嵌套数组达到三维及其以上。是最常见的多维数组,由于其可以用来描述三维空间中的位置或状态而被广泛使用。
7. 什么是链表数据结构?
这是最常见的数据结构面试问题之一,面试官希望你能给出全面的答案。尝试尽可能多地解释,而不是用一句话来完成你的答案!
它是一个线性数据结构或一系列数据对象,其中元素不存储在相邻的内存位置。元素使用指针链接以形成链。每个元素都是一个单独的对象,称为节点。每个节点有两项:数据字段和对下一个节点的引用。链表中的入口点称为头。如果列表为空,则头部为空引用,最后一个节点具有对空的引用。
一个链表是一个动态的数据结构,其中节点的数量是不固定的,这样的例子有扩大和缩小需求的能力。
它适用于以下情况:
我们处理未知数量的对象或不知道列表中有多少项目;
我们需要从列表中进行恒定时间的插入/删除,就像在时间可预测性至关重要的实时计算中一样;
不需要随机访问任何元素;
该算法需要一个数据结构,无论对象在内存中的物理地址如何,都需要在其中存储对象;
我们需要在列表中间插入项目,就像在优先队列中一样;
一些实现是堆栈和队列、图形、名称目录、动态内存分配以及对长整数执行算术运算
8.什么是双向链表?请举例
它是链表的一种复杂类型(双端 LL),其中一个节点有两个链接,一个连接到序列中的下一个节点,另一个连接到前一个节点。这允许在两个方向上遍历数据元素。
举例:
带有下一个和上一个导航按钮的音乐播放列表
具有 BACK-FORWARD 访问页面的浏览器缓存
浏览器上的撤消功能
9. 为什么要做算法分析?
一个问题可以使用多种解决算法以多种方式解决。算法分析提供对算法所需资源的估计,以解决特定的计算问题。还确定了执行所需的时间和空间资源量。
算法的时间复杂度量化了算法运行所花费的时间,作为输入长度的函数。空间复杂度量化了算法占用的空间或内存量,以作为输入长度的函数运行。
;㈢ 关于部署的一些经典算法
根据部署方式的不同,节点部署算法可分可为 确定性部署 和 随机性部署 两大类。确定性部署通常应用于环境友好或网络状态较为稳定的应用中,传感器节点根据应用需求被置于经过计算和安排后所确定的位置上,通过将节点部署问题抽象为数学问题中的线性规划问题,以网络性能或成本最优化为目标而提出解决方案[19];而随机部署则较为适用于环境恶劣或人工无法到达的监控环境中,传感器节点通常以抛洒的方式随机分布在目标区域内,节点位置往往是无法确定的。
确定性部署相比随机部署来说具有较优的网络性能,但在规模较大且应用环境十分恶劣的实际部署应用中,确定饥凳颤性部署往往占用了较高的人力成本和时间成本,而随机部署则充分体现了其简单和高效的优点,但同时,目标区域的覆盖性能却无法得到保证。
确定性部署被广泛应用于水下传感器网络。针对水下三维环境的节点部署问题,Pori等人提出了从二维空间到三维空间部署策略的适应性算法,文献[20]围绕着三维空间内的节点部署问题和规划,提出了一系列有效构建三维网络拓扑结构的规则,通过转换为二维问题来实现三维空间的节点部署问题。
在文献[21]中,作者通过计算得出网格部署模型下,满足基本网络覆盖和连通所需要烂败的活动节点数目,该算法为节点部署提供了理论基础,缺点是该方法只可适用于二维环境下的节点部署,无法满足水下无线传感器网络这种具有三维特性的应用需求。
最大平均覆盖算法(MAX_AVG_COV) 与 最大最小覆盖算法(MAX_MIN_COV) [22]的提出是基于网格部署模型,通过贪心算法策略进行节点部署,根据前驱节点的位置信息,决定下一个节点的布置位置。两种算法都旨在实现最佳网络覆盖,最大平均覆盖算法(MAX_AVG_COV)的目标是最大化网格点的平均覆盖效果,算法考虑的是整体网络的覆盖效果;而最大最小覆盖算法(MAX_MIN_COV)的目标是使得网络中覆盖效果较差的网格点的覆盖效果最大化,算法从优先改善网络局部性能的角度出发,优先把传感器放在性能最差的点上。两种算法用于概率感知模型,节点对目标事件的感知概率随着目标事件与节点间距离而变化,算法未能充分考虑冗余覆盖的问题,使得网络性能未能达到最佳表现,同时,两种算法复杂都较高,为 O(n^4)。
在文献[22]的基础上,蔺智挺等学者提出了一种整体-局部增进算法[23],该算法的特点是网络初始化后,算法迭代运行,粗行并且每次运行都放置一个传感器到传感器区域中,直到目标区域内所有点都满足覆盖要求或是已配置的传感器数目已达到能配置的传感器的数目的极限时才停止。在每次迭代过程中,算法寻找使网络整体有效覆盖性能改变最大的点,剔除局部冗余,提升了网络的整体性能。
当目标区域的环境十分恶劣时,比如战争区域、灾害防御地区、或是人类无法靠近的深海等,又或者在进行大规模的网络部署时,节点数目巨大,分布密集,这样的条件下采用确定性部署方式进行网络部署是不实际的甚至不可行的,此时,唯一可采用的方式是利用飞机、大炮等工具将节点以随机方式抛洒至目标区域,节点自组织成网络。
2001 年,作者 González-Banos 在文献[24]中提出了一种基于艺术画廊看守问题的随机部署策略,根据密度公式将传感器节点的位置以极坐标的表示方式建立了一种 R-random 的部署模型,它使用 R 来表示传感器节点与汇聚基站的距离。由于艺术画廊看守问题旨在解决有限边界内的最少覆盖问题,因此该文献在容错方面具有较好的性能,仿真实验表明了 R-random部署节点提升了整个传感器网络的可靠性。由于网络都采用多跳方式传输数据,因此越靠近基站的节点其能耗则越大,所以需在基站周围部署密度较大的节点以实现大量冗余节点,替代那些因能耗殆尽而死亡的节点,以此提升网络生存期,并保障数据的连通性。
在文献[25]中,作者提出了一种加权的节点随机配置算法,解决了在不同的区域内节点耗能速率不同的问题,也就是增加中继节点密度,使更多的中继节点分担负载,这样可以延长网络的平均生命周期。但改算法将大量的中继节点部署于距离基站较远的位置,因此网络的连通性将会受到影响。
虽然采用随机部署方式从某种程度上可提高部署效率并减少人工成本,但节点在网络中的相对坐标无法确定,因而这种部署方式无法保证目标区域具有良好的覆盖效果。因此在确定性部署与随机部署二者之间的选择上,Zhang H [26]围绕着确定性部署与随机部署两种方式究竟孰优孰劣的问题,分析并研究了实现一定程度的覆盖度所需的节点数目,作者分别考查了泊松分布、均匀随机分布、网格分布三种部署策略下维护网络 K 覆盖所需的节点密度,文章最后指出,采用网格部署方式所需的节点密度小于另外两种随机部署策略所需的节点密度,证明了网格部署策略在同等条件下所需的节点数目要优于随机部署策略。
在第二章,我们论述了部署方案的评价指标分别有良好的区域覆盖能力、数据信息的可达性和较长的网络生存期。本节将针对部署算法的这三个评价指标的优化对象的不同,从基于覆盖的部署、基于网络连通的部署和基于能量有效性的部署三个类别来对现有算法研究成果进行论述。
实现目标区域的覆盖面积最大化是无线传感器网络部署问题的基本目标,因此区域覆盖也已经成为了许多学者研究的出发点。针对目前 WSNs 应用中经济成本和客观环境的限制,在文献[27]中,作者研究了随机部署方式下有限无线传感器网络在目标区域内的覆盖概率的最大值和最小值,并提出了线性网络环境下实现最大覆盖概率的部署策略,但该部署策略仅适用于线性网络下对移动目标的监测环境。文献[28]将区域覆盖问题划分为面积覆盖、点覆盖和栅栏覆盖问题三大类并分别进行了阐述,面积覆盖问题主要研究的是如何实现覆盖面积最大化的问题;点覆盖旨在考查实现网络中个别目标的覆盖问题;栅栏覆盖的研究目标是如何降
低未知入侵发生的概率,它涉及运动检测。
文献[29]使用网格方法来进行覆盖率的计算,覆盖率的估算通过目标区域中被节点所覆盖的网格数与目标区域的网格总数量之比实现,目标区域所划分的网格数目决定了覆盖率的计算复杂度和结果的精确度,网格被划分得越细,最后计算所得的覆盖率其精确度越高,当然计算过程的开销也更大,如图 3.1 所示,同样 6 个节点,网格划分为 4×4 时所计算得出的覆盖率为 100%,而划分为 8×8 时所得的覆盖率为 98%。
文献[10]针对水下无线传感器网络的应用特性,提出一种节点可自我进行深度调节的算法,节点通过深度调节机制调整其在水下的深度,以实现水下三维环境覆盖率的最大化。初始阶段被部署与水底环境的各个传感器节点通过各自的 ID 号选取簇首节点,簇首节点负责通知该簇内其他节点的调节深度,通过判断节点间是否存在覆盖重叠区域来对节点进行分组管理,存在覆盖重叠的节点彼此分至不同的组号中,组号决定了节点将来被分配至水中的深度;待分组结束后,节点根据自己所在的组号移至水中相应的深度。该算法假设节点在水下环境只具备垂直方向上的移动性,由于簇首担当了对簇内其他成员节点转发管理指令的职责,因而造成了簇首节点的能耗将大于成员节点,而簇首节点的选举在只可在网络初始阶段即节点处于水底二维环境下进行,若簇首节点的死亡将造成整个簇内成员节点的瘫痪。
良好的网络连通性能够保证传感节点所采集到的信息准确及时的传递到使用终端。目前的研究文献中,关于网络连通性的问题多是在实现覆盖的前提下,通过增大节点通信半径来实现的,例如当 RT是 RS的比例 r>1 时,只需实现良好的网络覆盖,节点之间的连通性就能得到保障。然而,在节点通信能力相比感知能力较差的情况下,例如 RT=RS的情况下,网络的连通性能则无法得到保障。
文献[15]围绕着多连通问题展开研究,结合三维空间部署特性和对点阵模式的研究,提出了三维空间下实现 1-连通、2-连通 3-连通、4-连通的部署模型。文章所提的部署模型基于点阵模式,通过对相应模型中节点的通信半径和感知半径之间关系的研究,考查节点部署位置对网络中 K 连通效果的影响,该文所提出的最优模型实际是以 RT/RS比例为前提,在相应的RT/RS比例关系下,对应相应的模型,其最优性限制于节点通信半径与感知半径间的比例关系。
节点的分布密度和其在网络中所处的位置通常会直接影响到整体网络的生命周期,在节点分布过于密集的情况下,数据通信链路容易出现拥塞,使得网络传输负载失衡,从而造成通信负载瓶颈;另外,由于网络多采用多跳方式进行数据转发,因此在节点均匀分布的情况下,靠近基站的节点的能量耗损速度相对较快,从而造成整个网络的能量瓶颈问题。
文献[30]研究了具有最大生存期节点的部署问题。作者提出一种模型使得每个节点可以周期性地向基站发送数据报告。将每个周期数据采集所需的能耗作为衡量网络生命周期长短的标准,作者把问题转化为通过平衡节点负载,最小化每个节点每轮的平均能耗。文章假设网络采用大量的传感节点来传送探测数据,并且谨慎的选择后继节点使得数据传送所需的总能量最小。一种有效的算法是重新部署节点,从而形成最有效的拓扑结构。节点按其接近兴趣点的程度,被按降序挑选出来,算法在所有的传感器节点之间迭代,在每一步迭代中,传感器节点检查自己是否能作为后继节点传输数据。新地址的选择是基于运输流量,实际上,节点的重新部署是通过接近下游邻节点的方式以降低能量消耗。只有在网络的覆盖性不受影响的情况下,才允许重新部署传感器节点[31]。
在文献[32]中,节点在“休眠”-“活跃”两种状态间转换,在满足应用需求的前提下,非必要节点进入休眠状态,而其余节点继续保持活跃状态继续为网络服务;若因节点能量耗尽而退出网络,或应用需求的改变使得当前活跃节点数量无法满足应用需求,休眠节点进入活动状态。作者提出了一种可根据网络状态对节点进行动态管理的协议,以实现应用所规定的覆盖率和连通度目标,并对节点状态进行管理。通过几何关系的研究,考查覆盖率和连通率间的关系,并结合 SPAN 协议为网络覆盖率和连通率提供保障。
文献[33]研究了节点密度对网络生命期的影响,作者从部署角度考虑,分析得出网络生命期的解析公式。并通过研究发现网络生命期并非随节点数量的增加而成比例的增长,因此需要仔细筛选一定数量的节点来平衡网络的成本。考虑到当第一个节点死亡时网络就会中断,作者将问题转化为确定节点的数目并确定它们的位置来保持网络长时间运行。最后提出了两步的解决方案。首先,固定传感器节点的数量,通过多变量非线性问题来解决网络的优化部署,使其达到最长的网络生命期;然后,减少传感器节点数量同时实现最长网络生命期。该文献以固定传感器节点数目为前提,考察节点在网络中的位置,以形成生命期最长的网络拓扑结[31]。
静态网络的运行模式通常是通过预先设定的路由线路传递数据,在进行节点部署工作之前,首先根据应用特性和节点在网络中所发挥的作用来确定其在网络中所处的位置,待部署方案确定之后,方案将独立于网络的状态并且贯穿于整个网络生命周期内。在目前的应用中,可将节点按功能大致地分为四类:传感节点、中继节点、簇首节点和基站节点(汇聚节点)。
静态部署算法的缺点仅在网络初始阶段进行节点位置预判断,而节点的最佳位置的评估往往与网络的数据传输率、节点的感知能力、数据路径距离大小等因素息息相关,静态部署方式往往不考虑节点部署后的移动情况,因此无法根据应用需求对网络部署进行修补以改善网络性能。
文献[34]对异构网络下的节点进行确定性部署分析,采用分簇下的节点部署方案,网络中存在两种节点,一种是普通节点(Regular Sensor Nodes, R-SN),这类节点受通信、存储能量和计算方面的限制。另一类是高端复杂节点(High-endsophisticated sensor nodes,H-SN),即簇头节点,这类节点具有充分的资源。
在某些情况下网络状态是变化的,例如当新节点的加入或某节点能量耗尽时,网络拓扑结构和网络生存期会相应地发生变化,而静态部署策略并未能考虑到网络运行的这些动态变化,因此,为了适应网络的这种变化以实现网络性能的优化,需考虑采用动态方式。
在文献[35]中,节点具有移动性,待部署于目标区域后,各节点利用各自的排斥力朝着与邻节点相反的方向移动直至节点所受的来自各方向的排斥力达到平衡,因而这种方法减少了节点间的覆盖重叠区域。然而这也必然增加了节点的能耗,同时,该文献并未考虑网络的连通性。2005 年,作者 Howard 在文献[35]的基础上延伸了对网络连通率的研究[36],考查节点通信范围内的邻居节点数目并以节点间的吸引力来保证网络的连通性能。文献[35,36]算法的优点是执行起来简单易行,无须对环境进行预处理,且算法具有较强的鲁棒性,适用于大规模的节点部署应用;缺点是网络过于依赖节点的移动性,节点的能耗将是一个十分严重的问题。
类似地,Zou 和 Chakrabarty 学者所提出的 VFA 算法也是基于节点移动功能模块的增加[37],然而不同于文献[35]采用的一次性对节点进行移动,VFA 首先进行移动的模拟仿真,在确定移动后节点所处的位置后,节点一次性地移至该点,节点间移动距离的计算通过簇首节点完成,节点不单具有排斥力,还具有相互间的吸引力,在节点间距过密是通过排斥力扩大覆盖面积;当节点间距过疏时通过吸引力减少覆盖漏洞。该算法简单易用,可实现目标区域快速覆盖,部署效率较高,算法复杂度根据节点数目和目标区域面积变化,在划分为 n×m个网格的给定区域内部署 k 各节点的算法复杂度为 O(nmk)。
文献[9]引入一种新的传感器网络结构,提出了基于表面随机配置的水下无线传感器网络节点部署方法:在进行网络初始配置时,在水平面上随机布置一定数量的节点,然后根据每个节点调整空间内的邻居节点深度安排其自身深度,尽可能使水下三维空间得到充分的覆盖。