算法与数据结构

数据结构-顺序表

故事扮演 提交于 2020-01-24 19:29:17
判断题 1.(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。 T F 2.(neuDS)在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关。 T F 3.顺序存储方式只能用于存储线性结构。 T F 4.在顺序表中取出第i个元素所花费的时间与i成正比。 T F 5.对于顺序存储的长度为 N 的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为 O (1)和 O ( N )。 T F 6.(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。 T F 7.顺序存储的线性表可以随机存取。 T F 8.顺序存储结构的主要缺点是不利于插入或删除操作。 T F 选择题 1.用数组表示线性表的优点是()。 A.便于插入和删除操作 B.便于随机存取 C.可以动态地分配存储空间 D.不需要占用一片相邻的存储空间 2.阅读下列程序,其功能是()。 typedef struct { ElemType *list; int size; intMaxSize; }SeqList; void fun1(SeqList&L) { inti, j; ElemType temp; for (i=0, j= L.sise-1; i<j; i++, j--) { temp=L.list[i]; L.list[i]=L

数据结构与算法之哈希表

…衆ロ難τιáo~ 提交于 2020-01-24 15:59:16
哈希表 google公司的一个上机题: 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工的 所有信息. 要求: 不使用数据库,速度越快越好=>哈希表(散列) 添加时,保证按照id从低到高插入 (实际上就是叫我们创建链表数组) 代码实现 package hashtab ; import java . util . Scanner ; public class HashTabDemo { public static void main ( String [ ] args ) { // 创建哈希表 HashTab hashTab = new HashTab ( 7 ) ; // 写一个简单菜单 String key = "" ; Scanner scanner = new Scanner ( System . in ) ; while ( true ) { System . out . println ( "add: 添加雇员" ) ; System . out . println ( "list: 显示雇员" ) ; System . out . println ( "find: 查找雇员" ) ; System . out . println ( "del: 删除雇员" ) ; System . out

STL的使用和背后数据结构

拟墨画扇 提交于 2020-01-24 11:00:43
STL(Standard Template Library即,模板库)包括六个部分:容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors) vector 1、vector:连续存储 (1)头文件,#include<vector> (2)创建vector对象,vector<int> vec; (3)尾部插入元素,vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl; (5)使用迭代访问元素 1 vector<int>::iterator it; 2 for(it=vec.begin();it!=vec.end();it++) 3 cout<<(*it)<<endl; (6)插入元素,vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a (7)删除元素,vec.erase(vec.begin()+2);删除第3个元素         vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小,vec.size(); (9)清空,vec.clear(); vector的元素不仅仅只限于int型,int、double

数据结构基础(二)——线性表之顺序存储结构

大兔子大兔子 提交于 2020-01-24 03:05:04
线性表(线性存储结构)线性表是 最基本 、 最简单 、也是 最常用 的一种数据结构。它是数据结构与算法的基础之一。例如26个英文字母表:(A,B,C,D,···,Z)或者学生基本信息表又或者十二星座的排序等等,它们都是线性表。 一.线性表的定义和特点 线性表(linear list):是 n个具有相同特性的数据元素的有限序列 。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。 n的个数代表线性表的长度,当n = 0时,称为 空表 。 对于非空的线性表或线性结构,其 特点 是: 存在唯一的一个被称作“第一个”的数据元素; 存在唯一的一个被称作“最后一个”的数据元素; 除第一个之外,结构中的每个数据元素均只有一个前驱; 除最后一个之外,结构中的每个元素均只有一个后继; 对于前驱和后继 某一元素的左侧相邻元素称为“ 直接前驱 ”,位于此元素左侧的所有元素都统称为“ 前驱元素 ”; 某一元素的右侧相邻元素称为“ 直接后继 ”,位于此元素右侧的所有元素都统称为“ 后继元素 ”; 以图数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如图所示: 二.线性表的基本操作 InitList(&L) :构造一个空的线性表L。 DestroyList(&L) :销毁线性表L。

数据结构与算法——前缀树和贪心算法(2)

痴心易碎 提交于 2020-01-23 17:12:09
数的划分 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入:n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 ) 输出:一个整数,即不同的分法。 示例1 输入 //两个整数 n,k ( 6 < n ≤ 200, 2 ≤ k ≤ 6 ) 7 3 输出 //1个整数,即不同的分法。 4 C++ 法一:记忆化搜索 方法为减而治之,把n划分成k份的答案就相当于每次把n分成a,b两个数,再把a分成k-1份,然后把每次a分成k-1份的答案相加即可。注意点是每轮分出来的b要不大于上一轮分出来的b。 //https://www.nowcoder.com/questionTerminal/3773e51c48ec4727939cc85a8bc4c60d #include <bits/stdc++.h> using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define For(i,s,t) for (int i = (s); i <= (t); ++i) #define rFor(i,t,s) for (int i = (t); i >= (s); --i) #define

Java数据结构与算法精讲

被刻印的时光 ゝ 提交于 2020-01-23 03:19:40
课程简介 本系列视频教程为数据结构与算法基础,使用java语言描述,适合没有学过C/C++有一定Java基础的同学。没有Java基础的同学可以先行学习Java基础。 课程目录 ├─线性表 ├─栈和队列 ├─HashMap和LinkedHashMap ├─树 ├─二叉树 ├─图 ├─图的遍历与最小生成树 ├─图的最短路径与拓扑排序 ├─算法简介 ├─算法排序 ├─排序与归并 ├─递归与穷举 ├─贪心和分治 ├─动态规划和回溯 来源: CSDN 作者: di_pingxian 链接: https://blog.csdn.net/di_pingxian/article/details/103897423

页面置换算法-LRU,FIFO,LFU---golang实现

こ雲淡風輕ζ 提交于 2020-01-23 01:50:45
页面置换算法 页面置换算法 前提的数据结构 go语言实现双向链表数据结构 FIFOCache FIFOCache实现代码 测试数据和测试代码 测试结果 什么是LRU Cache 数据结构 代码实现 LFUCache 实现代码 测试代码和测试结果 页面置换算法 什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或网络内容缓存等。 前提的数据结构 不管是在fifo,lru,lfu的cache中,其底层数据结构 都是双向链表加hashmap实现的 go语言实现双向链表数据结构 package DoubleLinked import ( "fmt" "strings" ) type Node struct { key interface { } value interface { } prev , next * Node } // 实现打印方法 func ( this Node ) String ( ) string { builder :=

数据结构与算法----->数据结构----->堆

♀尐吖头ヾ 提交于 2020-01-22 04:18:25
13.1 堆的概念 堆是一种二叉树,是一种特殊的二叉树 节点的子节点的关键字 13.2 java程序实现堆这种数据结构 13.2.1编程思路:   step1,首先了解堆的概念 堆是完全二叉树 使用数组来存储堆元素,熟记数组元素下标和子节点、父节点的关系 如果堆中某个节点的数组下标为x,那么    熟记“”堆条件“”           step2,依据堆的概念,设计class Heap中成员函数—— fun:删除堆中关键值最大的节点 编程思路         java代码      step3,依据堆的概念,设计class Heap中的成员函数—— fun:往现有的堆中插入一个新的节点 编程思路: 向上筛选,使得新插入的节点关键值小于父节点关键值,大于子节点关键值,使得新的二叉树重新满足“”堆条件“” 只需要将新节点关键值和其“”暂时位置“”上的父节点的关键值相比较,并根据需要交换位置即可    java代码: trickleUp(int index)函数将新节点向上筛选使得重新满足堆条件,该函数的参数是节点在存储堆元素的数组中的位置下标 应注意上述程序中插入的一个新的节点之后,数组大小currentSize++           step4,依据堆的概念,设计class Heap中的成员函数—— fun:改变的堆中某个节点的值 编程思路: 如果该节点的关键值降低了

数据结构与算法之美-链表

风流意气都作罢 提交于 2020-01-22 01:09:58
什么是链表 和数组一样,链表也是一种线性表。 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。 链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。 链表的特点 插入、删除数据效率高,时间复杂度为O(1),只需更改指针指向即可。 随机访问效率低,时间复杂度为O(n),需要从链头至链尾进行遍历。 和数组相比,链表的内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。 常见的链表结构 单链表 每个节点只包含一个指针,即后继指针。 单链表有两个特殊的节点,即首节点和尾节点。 用首节点地址表示整条链表,尾节点的后继指针指向空地址null。 性能特点,插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。 循环链表 除了尾节点的后继指针指向首节点的地址外均与单链表一致。 适用于存储有循环特点的数据,比如约瑟夫问题。 双向链表 节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。 首节点的前驱指针prev和尾节点的后继指针next均指向空地址。 性能特点,和单链表相比,存储相同的数据,需要消耗更多的存储空间。 插入、删除操作比单链表效率更高,时间复杂度为O(1)。以删除操作为例

【数据结构与算法】HashTable相关操作实现 -- 基于Java的实现

会有一股神秘感。 提交于 2020-01-22 00:09:58
哈希表 哈希表又叫散列表,是实现字典操作的一种有效数据结构。哈希表的查询效率极高,在理想情况下,查找一个元素的平均时间为O(1)。 哈希表就是描述key—value对的映射问题的数据结构,即在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字与哈希表中唯一一个存储位置相对应。我们称这个对应关系f为哈希函数,这个存储结构即为哈希表。 直接寻 址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术,它的哈希函数很简单:f(key) = key,即关键字大小直接与元素所在的位置序号相等。另外,如果关键字不是自然数,我们需要通过某种手段将其转换为自然数,比如可以将字符关键字转化为其在字母表中的序号作为关键字。直接寻址法不会出现两个关键字对应到同一个地址的情况,既不会出现f(key1) = f(key2)的情况,因此不用处理冲突,这便是其优点所在。 散列表 直接寻址的缺点非常明显,如果全域U很大,则在一台标准的计算机可用内存容量中,要存储大小为U的一张表也许不太实际,而且,实际需要存储的关键字集合K可能相对U来说很小,这时散列表需要的存储空间要比直接表少很多。散列表通过散列函数f计算出关键字key在槽的位置。散列函数f将关键字域U映射到散列表T[0...m-1]的槽位上。但是这里会存在一个问题:若干个关键字可能映射到了表的同一个位置处(算法导论上名其曰“槽”)