程序设计
C和C++的区别
设计思想上
C++是面向对象的语言,C是面向过程的结构化编程语言
语法上
- C++具有封装、继承和多态
- C++相比C,增加许多类型安全的功能,如强制类型转换等
- C++支持范式编程,比如模板类、函数模板等
结构上
C和C++都有结构的概念,但是在C语言中结构只有成员变量,没有成员方法。而在C++结构中,它可以有自己的成员变量和成员函数。但在C语言中结构的成员是公共的,什么都可以访问它。
Java和C++的区别
都是面向对象的语言,都支持封装、继承和多态
指针
Java不提供指针来直接访问内存,程序更加安全
继承
Java的类是单继承的,C++支持多重继承
Java通过一个类实现多个接口来实现C++中的多重继承
内存
Java有自动内存管理机制,不需要程序员手动释放无用内存
翻译程序、编译程序和解释程序的区别
翻译程序:将一种语言编写的源程序翻译成另一种语言编写的目标程序
编译程序:将高级语言所编写的源程序翻译成机器语言或汇编语言编写的目标程序
解释程序:是一种翻译语言,跟编译程序差不多,但区别在于在翻译的过程中是边翻译边执行,中间不产生目标代码
数组和链表有哪些优缺点
数组的优点
- 查找效率高
- 可随机访问
数组的缺点
- 增删操作不方便,会引起大量元素的移动
- 内存空间大小固定,不能动态扩展,容易造成内存浪费
链表的优点
- 增删操作方便,只需要移动指针
- 可动态分配空间,内存利用率高
链表的缺点
- 不能随机访问,必须从第一个开始遍历,查找效率低
什么是封装、继承和多态
封装:对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。
实际项目开发中,使用封装最多的就是实体类。实体类有以下内容:
- 私有成员变量
- 无参数的构造器
- 有参数的构造器
- setter和getters方法
- 重写tostring方法
- 重写hashCode和equals方法
继承:
- 继承是面向对象程序设计能够提高软件开发效率的重要原因之一
- 继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷
- 继承来的属性和方法是隐式的,也就是在本类里面是看不见的
- 一个类只能有一个父类,也就是类只能是单继承
- 一个接口可以有多个父类,也就是接口可以是多继承
多态:
- 多态就是对象拥有多种形态:引用多态和方法多态
- 引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象
- 方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法
- 存在多态的必要条件:继承、重写
- 多态的作用是消除类型之间的耦合关系
什么是内存泄露
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束
一句话解释:内存空间使用完毕之后未回收
什么是异常处理
异常处理又称异常错误处理,它提供了处理程序运行时出现任何意外或异常情况的方法。异常处理通常是防止未知错误的发生所采取的处理措施,对于某一类型的错误,异常处理应该提供相应的处理方法
计算机网络
解释TCP/IP的三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包
ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
完成三次握手,客户端与服务器开始传送数据
虚电路和数据报的区别
虚电路和数据报都是分组交换的技术
- 数据报是无连接的,虚电路是面向链接的数据交换
- 数据报的分组都是通过独立的路由选择和转发,而同属于一条虚电路的分组按照同一路由转发
- 数据报不保证数据的可靠交付,虚电路的可靠性由网络保证
- 数据报不保证分组的有序到达,虚电路保证分组的有序到达
socket的含义
socket是两个计算机进行通信的一种约定或者一种方式。通过这种方式,一台计算机可以接收另一台计算机发送的数据。
它支持TCP/IP协议,包含五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。
socket的本质实际上是一个编程接口(API),是应用层与TCP/IP 协议族通信的中间软件抽象层,它对 TCP/IP 进行了封装,把复杂的TCP/IP协议簇吟唱在socket接口后面。
计算机网络中数据传输时并行还是串行
串行传输。
串行传输时一根数据线传输数据;并行传输是多跟数据线同时传输数据
DNS的工作原理
DNS是应用层协议,事实上它是为其它应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为IP地址。
过程如下:
- 用户主机上运行DNS的客户端
- 浏览器将接收到的URL中抽取出域名字段,就是访问的主机名,然后将这个主机名传送给DNS应用的客户端
- DNS客户端向DNS服务器发送一份查询报文,报文中包含要访问的主机名字段
- 该DNS客户机最终会收到来自DNS的IP地址,然后就可以向该IP地址的HTTP服务器发起TCP链接
- 一但浏览器收到来自DNS的IP地址,就可以向该地址定位的HTTP服务器发起TCP连接
点击一个链接的网络过程
- 解析URL:浏览器对URL进行解析,得到里面的参数,将域名和需要请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上的什么资源等等
- 浏览器封装HTTP请求报文
- DNS域名解析获取IP地址
- 建立TCP连接:获得目标服务器IP后,浏览器和服务器之间就通过三次握手建立起可靠的连接,保证双方都具有可靠的接收和发送能力
- 浏览器发送请求:通过三次握手建立可靠的虚拟通道后,浏览器就开始发送自己的HTTP请求了
- 负责传输的IP协议:TCP 在三次握手建立连接、四次握手断开连接、以及连接建立过程中的收发数据(TCP 报文段)等各阶段操作时,都是通过 IP 协议进行传输的,IP 协议将这些阶段的数据添加 IP 首部封装成 IP 数据报再进行传输
- 使用ARP协议凭借MAC地址通信
- 服务器响应请求
- 浏览器显示界面
TCP/IP
TCP/IP协议不是TCP和IP这两个协议的合称,而是因特网整个TCP/IP协议族。具体可以由以下几部分组成
- TCP/IP模型
- 数据链路层
- 网络层
- ping
- Traceroute
- TCP/UDP
- DNS
- TCP连接的建立与终止
- TCP流量控制
- TCP拥塞控制
网络的拓扑结构
- 总线型拓扑结构
优点:连接形式简单,易于实现,所用线缆最短,增加或者移除节点比较灵活,个别结点发生故障时,不影响网络中其结点的正常工
缺点:网络传输能力低,安全性低,总线发生故障时,会导致全网瘫痪。结点数量的增多会影响网络性能 - 星形拓扑结构
优点:结构简单,建网容易,控制简单,维护容易,网络传输速度快
缺点:属于集中控制。主机负载过重,可靠性低,通信线路利用率低,安全隐患大 - 环形拓扑结构
优点:一次通信的最大传输延迟是固定的,每个网上结点只与其他二个结点有物理链路直接互连。传输控制机制简单,实时性强
缺点:一个结点发生故障时,可能导致全网瘫痪,可靠性差。维护困难,扩展性能差 - 混合型拓扑结构
网络分层有什么好处
- 各层次之间是独立的
- 灵活性好
- 结构上可以分割开
- 易于实现和维护
- 能促进标准化工作
IPV4和IPV6的区别
- 地址空间不同
- 路由表大小不同
- 组播支持不同
- 安全性不同
- 协议扩充不同
HTTPS协议是怎么实现的
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
- 浏览器验证证书合法性,结合证书公钥加密信息发送给服务器
- 服务器使用私钥解密信息,验证哈希,加密响应信息回发给浏览器
- 浏览器解密响应信息,并对信息进行验真,之后进行加密交互数据
SSL协议是什么
SSL证书全称为安全套接层协议(Secure Sockets Layer)证书,是遵守SSL安全套接层协议的服务器数字证书。它通过加密算法,将HTTP明文传输变成HTTPS暗文传输
XML和HTML
HTML:超文本标记语言,超文本就是页面可以包含图片、连接、甚至音乐、程序等非文字元素
XML:可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网的传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据
相似点
- 都是标记语言
- 由相似的语法
不同点
- HTML主要用于数据的显示,侧重外拐;XML用于数据的传输,侧重内容
- HTML用户不能自定义标签,标签都是预定义的;而XML更加灵活,因为它没有标签集和无语言规则的语言,用户可以自定义
- HTML是写给浏览器看的语言;而XML则可以跨平台进行信息交流
- HTML有的标签可以没有</>作为结束;XML语法十分严格,必须对称,有开始就必须有结束
Cookie是什么,有什么作用
Cookie是由Web服务器创建并保存在用户浏览器上的小文本文件,它以key/value的形式保存用户的相关信息,这些数据通常会经过加密处理。当用户链接到服务器,Web站点可以访问Cookie信息
作用:
- Cookie的两个主要用途:存储用户信息和个性化定制
- Cookie最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的作用
- 另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的上面,这些信息都会写入Cookies,以便在最后付款时提取信息
数据库
网络接口层:主机必须使用某种协议与网络相连
网络层:网络层是整个体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标。这些分组可能经由不同的网络,到达顺序和发送顺序也可能不同。高层如果需要顺序收发,那么就必须自行处理对分组的排序。互联网使用因特网协议(IP,Internet Protocol)。
传输层:使源端和目的端机器上的对等实体可以进行会话。在这一层定义了两个端到端的协议:传输控制协议(TCP,Transmission Control Protocol)和用户数据报协议(UDP,User Datagram Protocol)。TCP是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性的保证、流量控制、多路复用、优先权和安全性控制等功能。UDP是面向无连接的不可靠传输的协议,主要用于不需要TCP的排序性和流量控制等功能的应用程序
应用层:应用层包含所有的高层协议,包括:虚拟中断协议(TELNET, TELecommunications NETwork)、文件传输协议(FTP,File Transfer Protocol)、电子邮件传输协议(SMTP, Simple Mail Transfer Protocol)、域名服务(DNS,Domain Name Service)、网上新闻传输协议(NNTP,Net News Transfer Protocol)和超文本传送协议(HTTP, HyperText Transfer Protocol)等
数据库外模式和内模式
外模式:也叫用户模式,是用户可见的局部数据的逻辑结构和特征
内模式:也叫存储模式,是数据库的物理结构和存储方式,是数据在数据库内部的组织方式
数据库完整性操作
数据库完整性可确保输入至数据库中的数据是准确、有效以及一致的。数据库中任何数据改动都必须呵护所有完整性限制以及数据有效性检验
数据库完整性主要有三项完整性限制
- 实体完整性,同一数据表中不可有多项记录拥有相同识别
- 域完整性,限制字段中的数据必须呵护默认的数据类型
- 参照完整性,两个数据表是有关联的,那么父数据表的记录必须存在,子数据表的记录才存在
如何编写高效的查询语句
- 创建合理的索引
- 对查询进行优化,应尽量避免全表扫描
- 尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
- 尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
范式的定义
- 第一范式:当关系模式R的所有属性都不能再分解为更基本的数据单位时,称R是满足第一范式,即属性不可分
- 第二范式:如果关系模式R满足第一范式,并且R的所有非关键属性完全依赖于R的每一个候选关键属性,称R满足第二范式
- 第三范式:设R是满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,即非主属性不传递依赖于键码(简而言之,第三范式就是属性不依赖于其它非主属性)
数据库的事务
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一些列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
事务的四个特性ACID
- 原子性
- 一致性
- 隔离性
- 持久性
索引建的多好还是少好
- 数据量小的表不需要建立索引,建立会增加额外的索引开销
- 数据变更需要维护索引,因此更多的索引意味着更多的维护成本
- 更多的索引意味着也需要更多的空间(索引也是需要用空间来存放的)
所以可以少就少
操作系统
进程和线程的区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些
- 一个程序至少有一个进程,而一个进程至少有一个线程
- 线程的划分尺度小于进程,所以多线程程序的并发性高
- 进程在执行过程中拥有独立的内存单元,而多个线程是共享内存,从而极大地提高了程序的运行效率
- 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能独立执行,需要依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
临界区与互斥量的概念和区别
临界区:进程中访问临界资源的那段程序
互斥量:保证共享数据操作的完整性,使得在任一时刻只有一个线程访问该对象
区别:互斥量和信号量在系统的任何进程里都是可见的,一个进程创建了一个信号量或互斥量,另一个进程试图去获取该锁是合法的。但林基区的作用范围仅限于本进程,其他进程无法获取该锁。
分段的地址结构变化
分页的作业地址空间是一维的,而分段的作业地址空间是二维的。
分段地址结构是<段号,段内偏移量>
将作业分成若干个逻辑段,每个段都有自己的段号,然后再将每个段分成若干个大小相同的页。
32位系统能上16G内存吗
不能。因为支持的最大内存是4G
- 32位X86架构是指个人电脑的地址总线是32位的,CPU、内存控制器、操作系统都是按32位地址总线设计。32位地址总线可以支持的内存地址代码是4096MB,也就是4GB的地址代码,可以编4GB个地址。这个4GB的地址码正好可以分配给4GB内存
操作系统的基本概念(什么是操作系统/操作系统的目标和功能)
- 操作系统是计算机资源的管理者
- 操作系统为用户提供使用计算机硬件的接口
- 操作系统用作扩充器
进程上下文切换发生的条件
- 中断处理
- 多任务处理
- 用户状态切换
操作系统有哪些部分
设备管理:主要负责内核与外围设备的数据交互,实质是对硬件设备的管理,包括对输入输出设备的分配、初始化、维护和挥手等
作业管理:主要是负责人机交互、图形界面或系统任务的管理
文件管理:设计涉及文件的逻辑组织和物理组织,目录结构和管理等
进程管理:说明一个进程存在的唯一标志是pcb(进程控制块),负责维护进程的信息和状态。进程管理实质上是系统采取某些进程调度算法来使处理合理的分配给每个任务使用
存储管理:数据的存储方式和组织结构
中断具体是什么操作
所谓中断是指系统发生某一事件后,CPU暂停正在执行的程序去执行处理该事件的程序过程,处理中断事件的程序称为中断处理程序,产生中断信号的那个部件称为中断源。硬件的中断机构与处理这些中断的程序统称为中断系统。
当中断发生时,硬件机构自动地进入响应中断过程,由操作系统的中断处理程序对中断事件进行处理,具体过程如下
- 保存现场
- 分析原因,转中断处理程序
- 恢复现场
中断隐指令
CPU响应中断之后,经过某些操作,转去执行中断服务程序。这些操作是由硬件直接实现的,把它称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,它没有操作码,所以中断隐指令是一种不允许、也不可能为用户使用的特殊指令。其完成的操作主要有
- 保存断点
- 暂不允许中断
- 引出中断服务程序
死锁产生的原因和必要条件
原因:
- 竞争资源
- 进程间推进顺序非法
四个必要条件:
- 互斥条件:进程对所分配的资源排它性使用,即在一段时间内某资源只由一个进程占用
- 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放
- 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时自己释放
- 环路等待条件:指在发生死锁时,必然存在一个进程的环形链
计算机组成原理
CPI内寄存器的功能
CPU中至少要有六类寄存器:指令寄存器IR、数据寄存器DR、程序计数器PC、程序状态字寄存器PSW、累加寄存器AC(通用寄存器)
功能:
- 指令寄存器:用来存放当前正在执行的一条指令
- 数据寄存器:CPU、内存和外村的中转站,起缓冲作用,用来暂存计算过程中读出或存入的数据
- 程序计数器:用来指出下一条执行的指令在主存中的地址
- 地址寄存器:用来保存CPU当前所访问的主存单元的地址
- 程序状态字寄存器:用来保存当前运算的各种状态条件标志
- 累加寄存器:是一种通用寄存器,用来保存算数逻辑单元ALU执行运算后的结果
DRAM与SRAM的区别
| SRAM | DRAM | |
|---|---|---|
| 原理 | 触发器 | 电容 |
| 读出 | 非破坏性 | 破坏性 |
| 刷新 | 不用 | 用 |
| 送地址 | 一起送 | 行列分开送 |
| 速度 | 快 | 慢 |
| 集成度 | 低 | 高 |
| 功耗 | 高 | 低 |
| 成本 | 高 | 低 |
| 用途 | Cache | 内存 |
流水线的性能指标有哪些
流水线是指把一个重复的过程分解为若干子过程,每个子过程与其他过程并行运行。
流水线的指标有吞吐量、加速比、效率
吞吐量是指单位时间内流水线所完成的单位数量
加速比是指完成相同任务的前提下,使用流水线所花时间和不使用流水线所花时间之比
效率是指流水线的设备利用率
冯诺依曼体系结构
组成:
输入设备、输出设备、存储器、运算器、控制器
- 输入单元:键盘、树表、扫描仪、写字板等
- 中央处理器(CPU):含有运算器和控制器等
- 输出单元:显示器、打印机等
理解:
- 这里的存储器是指内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 外设要输入或输出数据也只能写入内存或从内存中进行读取
- 所有设备都只能直接跟内存打交道。
安全
防火墙技术的特点及其组成部分
防火墙是计算机硬件和软件组成的系统,部署于网络边界,是连通内网和外部网络的桥梁。
防火墙技术包括:包过滤、应用代理、网络地址转换。
特点:
- 防火墙可以防止非法用户进入内部网络,减少内网中主机的风险
- 集中管理内部网络,增强保密性
缺点:
- 不能防范来自内部的攻击
- 不能防范未知的威胁
说出两个以上关于身份认证技术方面的措施
数据结构
排序相关
- 插入排序
对于一个待排序数组来说,其初始有序数组个数为1,然后从第二个元素,插入到有序数组中。对于每一次插入操作,从后往前遍历有序数组,如果当前元素大于插入元素,则后移一位;如果当前元素小于或等于要插入的元素,则将要插入的元素插入到当前元素的下一位中。 - 希尔排序
先将整个待排序记录分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。其子序列的构成不是简单的逐段分割,而是将每隔某个增量的记录组成一个子序列。希尔排序的时间复杂度与增量序列的选取有关,其最后一个增量值必须为1。 - 归并排序
该算法采用分治法:对于包含m个元素的待排序序列,将其看成m个长度为1的子序列。然后再两两合归并,得到n/2个长度为2或者1的有序子序列;然后再两两合并,直到得到一个长度为m的有序序列。 - 冒泡排序
对于包含n个元素的待排序数组,重复遍历数组,首先比较第一个和第二个元素,若为逆序,则交换元素位置;然后比较第二个和第三个元素,重复上述过程。每次遍历会把当前n-i个元素中的最大的元素移到第n-i位置。遍历n次,完成排序。 - 快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 - 选择排序
每次循环,选择当前无序数组中最小的那个元素,然后将其与无序数组的第一个元素交换位置,从而使有序数组元素加1,无序数组元素减1,初始时无序数组为空。 - 堆排序
堆排序是一种选择排序,利用堆这种数据结构来完成。其算法思想是将待排序的数据构造成一个最大堆(升序)/最小堆(降序),然后将堆顶元素与待排序数组的最后一个元素交换位置,此时末尾元素就是最大/最小的值。然后将剩余n-1个元素重新构造成最大堆/最小堆。
贪心算法
定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关
步骤:
- 建立数学模型来描述问题
- 把求解的问题分成若干个子问题
- 对每一个子问题求解,得到子问题的局部最优解
- 把子问题的局部最优解合成原来问题的一个解
动态规划算法
思想:动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。
但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
如果能够保存已解决的子问题的答案,而在需要时再找出以求得的答案,就可以避免大量重复计算,从而得到多项式时间算法
步骤:
- 找出最优解的性质,并刻划其结构特征
- 递归地定义最优值
- 以自底向上的方式计算出最优值
- 根据计算最优值时得到的信息,构造最优解
迪杰特斯拉最短路径
Dijkstra算法是典型的最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止
思路:通过迪杰特斯拉计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
起始时,S中只有起点s;U是除s之外的顶点,并且U中顶点的路径是“起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。…重复该操作,直到遍历完所有的顶点
步骤:
- 初始时,S中只包含起点s;U中包含除s外的其他顶点,且U中顶点的距离为“起点s到该顶点的距离”【例如:U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为无穷】
- 从U中选出“距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k
- 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如:(s,v)的距离可能大于(s,k)+(k,v)的距离
- 重复步骤2和3,直到遍历完所有顶点
快速排序和插入排序哪个更高效
- 就排序的速度而言,那么快速排序几乎是最佳选择。但是快速排序也有一定的局限性,对于完全顺序或者完全逆序且数据量十分庞大的数据,在递归的过程中会存在系统堆栈溢出的风险
- 如果数据已经基本有序,插入排序或者希尔排序只需要进行比较以及进行少量的插入操作即可完成,速度会有大幅度提升,且不会出现快速排序面对几乎完全顺序的数据时可能出现的系统堆栈溢出的风险
- 选择排序和堆排序相对稳定,没有最优情况和最差情况的区分
其他
计算机的局部性是什么
局部性分为时间局部性和空间局部性
时间局部性:指一个信息被访问,那么它再近期很可能再次被访问
空间局部性:指一个存储位置被访问,那么它附近的存储位置很可能下次被访问