数据结构与算法

编程珠玑:插入排序优化

余生长醉 提交于 2021-01-14 02:42:45
插入排序的精髓就是首先将第一个元素视为有序子数组x[0...0],然后插入x[1]...x[n-1].思想很简单,代码也很简单,简单的代码有没有优化的空间呢?编程珠玑中提供了几个优化后的方案,效率提高了70%之多。 简单的实现(sort1) void insertSort(int *array, size_t size) { for(size_t i = 1; i < size; i++) { for(int j = i; j > 0 && array[j - 1] > array[j]; j--) { swap(array[j - 1], array[j]); } } } 优化思路 内循环的swap函数可能不如内联函数快些,所以第一步优化将该swap函数展开,据作者说,展开后效率提高了60%。 优化代码(sort2) void insertSort(int *array, size_t size) { for(size_t i = 1; i < size; i++) { for(int j = i; j > 0 && array[j - 1] > array[j]; j--) { int t = array[j]; array[j] = array[j - 1]; array[j - 1] = t; } } } 优化思路 由于内循环中总是给变量t赋同样的值(x[i]的初始值)

编程珠玑:向量旋转(旋转交换)

大兔子大兔子 提交于 2020-03-19 13:04:16
3 月,跳不动了?>>> 问题描述 请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8,i=3,那么向量abcdefgh旋转之后得到向量defghabc。简单编码使用一个具有n个元素的中间向量分n步即可完成此作业。你可以仅使用几十字节的微小内存,花费与n成比例的时间来旋转该向量吗? 解决思路 方案一: 将向量x中的前i个元素复制到一个临时数组中,接着将余下的n-i个元素左移i个位置,然后再将前i个元素从临时数组中复制回x中的后面位置。 该方案使用了i个额外的位置,如i足够大,过于浪费空间。 方案二: 定义一个函数来将x向左旋转一个位置,然后调用该函数i次。 该方案需要将数组移到i将,过于浪费时间。 方案三: 先将x[0]移临时变量t中,然后将x[i]移到x[0]中,x[2i]移到x[i]中,依次类推,直到我们又回到从x[0]中提取元素,不过在这时我们要从t中提取元素,然后结束该过程。当i=3,n=12时,该阶段将以下面的次序移到各个元素。 如果该过程不能移动所有的元素,那么我们再从x[1]开始移动,一直依次进行下去,直到移动了所有的元素时为止。 该方案过于精巧,像书中所说的一样堪称巧妙的杂技表演,非常容易出错。 方案四: 旋转向量x实际上就是将向量ab的两个部分交换为向量ba,这里a代表x的前i个元素。假设a比b短。将b分割成b l 和b r ,使b r

《数据结构与算法》—— O(3N)=O(N) ?

家住魔仙堡 提交于 2020-03-01 22:52:24
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: ADT 抽象数据对象名 { 数据对象:(数据对象的定义) 数据关系:(数据关系的定义) 基本操作:(基本操作的定义) } 算法与数据结构 算法

《数据结构与算法》—— O(3N)≈O(N) O(3N)=O(N)?

自作多情 提交于 2020-03-01 22:25:41
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: 1ADT 抽象数据对象名 {2 数据对象:(数据对象的定义)3 数据关系:(数据关系的定义)4 基本操作:(基本操作的定义)5} 算法与数据结构 算法

《数据结构与算法》—— O(3N)=O(N) ?

邮差的信 提交于 2020-03-01 21:44:26
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: 1ADT 抽象数据对象名 {2 数据对象:(数据对象的定义)3 数据关系:(数据关系的定义)4 基本操作:(基本操作的定义)5} 算法与数据结构 算法

浅谈如何学习数据结构与算法[@初学者]

自闭症网瘾萝莉.ら 提交于 2020-02-07 01:57:52
导语 所谓“数据结构”,一般来说是“数据结构与算法”,是NOIPer/NOIer、本科生、硕士生、程序员都会学的一门课程,是程序员的必修课。 数据结构为什么要学? 我们使用计算机,希望它能帮助我们解决各种各样的问题,但随着发展—— 我们希望它运行得更快, 希望它能处理更多数据,希望它做一些原本不可能的事情…… 计算机科学不断改变着这个世界,但代价可能是高昂的。 好的算法设计可以做得更好,而且可能很便宜;劣质的算法就不得不花费更高昂的代价。 事实上,我们可能认为提高算力就能忽略劣质算法的影响。诚然,我们也在努力提高计算机算力,但即使强如超级计算机,也无法挽救一个错误的算法。 希望很多人能正视这个问题,因为数据结构与算法真的值得学习。 学科基础 学习数据结构与算法不需要太多的基础知识,但需要你熟练掌握一门编程语言。 至少给你C/C++/Java/Python的代码你能看得懂,让你用自己熟练的编程语言能轻松实现,这样就很棒了。 至于二分查找、冒泡排序、数组之类的内容我觉得是一个刚刚入门计算机科学的孩纸就应该会的,所以就很基础,没啥可说的,该会,对吧?(比如你连冒泡排序都不会,你咋学快排啥的,对吧?) 最好有一些经验积累,我在学数据结构之前就能在一定程度上运用Java的集合框架,看过比如java.util.ArrayList啊,java.util.LinkedList这样的类的源码

《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找

耗尽温柔 提交于 2020-02-03 04:18:49
《数据结构与算法》实验和课程Github资源 《数据结构与算法》实验报告 学生姓名 郭茁宁 院(系) 计算机科学与技术 学 号 1183710109 专 业 软件工程 实验时间 2019年12月20日(周五) 实验地点 格物213室 实验项目 实验 4/5 : 查找结构的实验比较 (3学时) 实验目的: 将课程的基本原理、技术和方法与实际应用相结合,训练和提高学生组织、存储和处理信息的能力,以及复杂问题的数据结构设计能力和程序设计能力,培养软件设计与开发所需要的实践能力。 实验要求: 灵活运用基本的数据结构和算法知识,对实际问题进行分析和抽象;结合程序设计的一般过程和方法为实际问题设计数据结构和有效算法;用高级语言对数据结构和算法进行编程实现、调试,测试其正确性和有效性。 实验内容: BST 查找结构与折半查找方法的实现与实验比较 本实验要求编写程序实现 BST 存储结构的建立(插入)、删除、查找和排序算法;实现折半查找算法;比较 BST 查找结构与折半查找的时间性能。 1 . 设计BST 的左右链存储结构,并实现BST插入(建立)、删除、查找和排序算法。 2 . 实现折半查找算法。 3 . 实验比较:设计并产生实验测试数据,考察比较两种查找方法的时间性能,并与理论结果进行比较。以下具体做法可作为参考: (1)第1组测试数据: n=1024个已排序的整数序列

《数据结构与算法》实验:排序算法实验比较——选择排序 & 堆排序

心已入冬 提交于 2020-02-03 00:11:04
《数据结构与算法》实验和课程Github资源 《数据结构与算法》实验报告 学生姓名 郭茁宁 院(系) 计算机科学与技术 学 号 1183710109 专 业 软件工程 实验时间 2019年12月27日(周五) 实验地点 格物213室 实验项目 实验 /5-5 : 排序算法实验比较(4学时) 实验目的: 将课程的基本原理、技术和方法与实际应用相结合,训练和提高学生组织、存储和处理信息的能力,以及复杂问题的数据结构设计能力和程序设计能力,培养软件设计与开发所需要的实践能力。 实验要求: 灵活运用基本的数据结构和算法知识,对实际问题进行分析和抽象;结合程序设计的一般过程和方法为实际问题设计数据结构和有效算法;用高级语言对数据结构和算法进行编程实现、调试,测试其正确性和有效性。 实验内容: 排序算法的实现与实验比较 实现一组经典的排序算法,通过实验数据的设计,考察不同规模和分布的数据对排序算法运行时间影响的规律,验证理论分析结果的正确性。 1 . 实现以下三组排序方法中的一组排序算法: ( 1 )冒泡排序和快速排序; ( 2 )插入排序和希尔排序; ( 3 )选择排序和堆排序。 2 . 产生不同规模和分布的数据,以“图或表”的方式给出输入规模和分布对排序方法运行时间变化趋势的影响(画出 T(n) 的曲线)。并与理论分析结果比较。 3 . 将上述“图或表”采用图片等形式贴在实验报告中