#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_array(int a[],int len,int max); void print_array(int a[],int n); void main(){ printf("please input two numbers as the array's length and the array's ma…
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typedef int ElementType; #ifndef _List_H #define _List_H struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; Li…
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算…
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-List),即最基本的数据结构——线性表的链式存储结构.比起顺序存储,其好处在于空间使用的灵活性,以及插入.删除操作的高效性.下面给出笔者的链表结构C语言实现.其中算法和细节部分定有可优化之处,欢迎大神指正. // LinkedList.h #ifndef _LINKEDLIST_H #define _LINK…
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark Allen Weiss) 内容简介 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书把算法分析与最有效率的Java程…
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3.2实现一个接口P.3.3接口作为数据类型P.3.4派生一个接口P.3.5接口内命名常量P.4xuan择类P.4.1标识类P.4.2CRC卡P.4.3统一建模语言P.5重用类D11章包1.1什么是包1.2说明一个包1.3使用ADT包1.4像使用自动贩卖机一样使用ADT1.5ADT集合1.6Java类库…
第一章 概述 1.0 序言 自己为啥要学数据结构嘞,我觉得主要有以下三个原因: 前段时间在看并发编程时,发现aqs,corrunthashmap等底层都用到了数据结构,主要的有队列,还有链表,学习数据结构有助于你更好的去看懂源码. 学习数据结构让你在编写代码时,在脑海中有一个更好的轮廓,知道自己要用什么来存储.处理数据,效率更高. 主要是最近面了一个公司,自己Java基础.多线程.redis.mq.分布式框架等都回答的可以,后面又加了一轮算法机试,因为不是科班,自己这块太薄弱了,难过呀铁子,决定…
算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ cf(N),则记为T(N) = O(f(N)). (描述了T(N)的相对增长率小于等于f(N)的相对增长率.) 2.大Ω表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≥ cf(N),则记为T(N) = Ω(f(N)). (描述了T(N)的相对增长率大于等于f(N)的相对增…
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类型(ADT)的概念学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充.对于每种A…
对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1.  按增长率排列下列函数:N,√2,N1.5,N2,NlogN, NloglogN,Nlog2N,Nlog(N2),2/N,2N,2N/2,37,N2logN,N3.指出哪些函数以相同的增长率增长. 答:排列如下2/N < 37 < √2 < N < NloglogN < NlogN < Nlog(N2) < Nlog2…
这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情形.必须总有些基准情形.它无需递归就能解出. 不断推进.对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝接近基准情形的方向推进. 设计法则.假设所有的递归调用都能运行. 合成效益法则.在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作.(譬如斐波那契数列的递归使用 Fib…
ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本对象加r2的结果 -(self, Rational r2) #求出本对象减r2的结果 *(self, Rational r2) #求出本对象乘以r2的结果 /(self, Rational r2) #求出本对象除以r2的结果 num(self) #取出本对象的分子 den(self) #取出本对象的…
ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference(self, Date d2) #求出self和d2的日期差 plus(self, int n) #计算出日期第self之后n天的日期 num_date(self, int year, int n) #计算year年第n天的日期 adjust(self, int n) #将日期d调整n天(n为带符号整…
题目:定义一个表示时间的类Timea)Time(hours,minutes,seconds)创建一个时间对象:b)t.hours(),t.minutes(),t.seconds()分别返回时间对象t的小时,分钟和秒值c)为Time对象定义加法和减法操作(用运算符+和-)d)定义时间对象的等于和小于关系对象(用运算符==和<) #!/usr/bin/env python # -*- coding:utf-8 -*- """ 定义一个表示时间的类Time a)Time(ho…
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 3.3.2 Iterator 接口 3.3.3 List接口.ArrayList 类和 LinkedList 类 3.3.5 关于 ListIterator 接口 3.4 ArrayList 类的实现 3.5 LinkedList 类的实现 3.6 栈 ADT 3.6.1 栈模型 3.6.2 栈的…
散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于哈希函数,例程中以“Key为int型,操作为取(关于表长的)模”为例.事实上,可以直接将其换成任何一个哈希函数,不会影响实现. 对于冲突处理,有两大类处理方案,一是分离链接法,二是开放定址法.开放定址法包括线性探测法.平方探测法.双散列法等,本文给出分离链接法和平方探测法的实现. 1. 分离链接法:…
上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元素,形成的二叉查找树实际上是一个线性表,每层只有一个元素,元素数与层数相同. 事实上,不只这一种情形.在很多情况下,都有可能出现这种结构.这样一来,二叉查找树就失去了它存在的意义.于是,我们考虑在每次插入和删除元素时,对树的结构进行一些检查和维护,使其每层的元素数尽可能多,从而尽可能降低层数,我们称…
二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二叉树的性质,查找操作的时间复杂度可以由线性降低到O(logN). 当然,这一复杂度只是描述了平均的情况,事实上,具体到每一棵二叉搜索树,查找操作的复杂度与树本身的结构有关.如果二叉树的结点全部偏向一个方向,那么与线性查找将毫无区别.这就牵扯到二叉树的平衡问题,暂时不做考虑. 下面给出二叉搜索树的实现…
这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的一个“活动记录”( Activation Record ,或称作“帧”( Frame ))压入运行时堆栈中,用于保存函数的参数,返回值,返回指令地址,返回活动记录地址,局部变量等内容.当然,在高级语言中我们不需要手动完成这一工作,学习汇编语言时会体会到其真正过程. 下面给出笔者对于堆栈的两种实现.首…
P1.1 选择问题,选择出第K大的数,并画出N为不同值的运行时间,K=N/2 毕业两年半,重写排序,感觉良好.代码使用冒泡排序,库函数clock计算大致运行时间. // P1_1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <malloc.h> #include <stdlib.h> #include <time.h&g…
经过ubuntu的gcc验证 一.头文件 que_link.h #ifndef _QUE_LINK_H_ #define _QUE_LINK_H_ struct que_record; typedef struct que_record* que; struct link_node; typedef struct link_node* node; typedef int elementType; int IsFull(que q); int IsEmpty(que q); que creatQu…
一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* queue; typedef int element_type; int IsEmpty(queue q); int IsFull(queue q); queue creat_que(int max_element); void make_empty(queue q); void enqueue(elem…
一.头文件: #ifndef _STACK_LINK_H_ #define _STACK_LINK_H_ struct stack_record; typedef struct stack_record* stack; typedef int elementType; struct link_node; typedef struct link_node node; int IsEmpty(stack s); int IsFull(stack s); stack creatStack(int ma…
第6题:工资部门将每个支付周期的雇员信息的列表保存到一个文本文件, 每一行的格式:<last name><hourly wage><hours worked> 编写一个程序,让用户输出文件名并且最终向终端输出报表. 自行创建一个txt文件,如下图所示: 代码: 方法一.从txt文件中读取内容,并向excel表格文件写入 import xlwt word=[] fileName=input("请输入文件名:") f=open(fileName,'r')…
第三个结构——队列(Queue) 队列与上次的栈相反,是一种先进先出(FIFO)的线性表.写入时只暴露尾部,读取时只暴露头部. 本次只实现了数组形式的队列.原因是链表形式的队列极为简单,只需要实现简单的删除首结点和尾部插入两种操作,在此便不再具体实现. 而对于数组形式的队列,内存单元固定,又不具备像栈一样一端固定的特性,为使数组中的空间可被重复使用,需使得队列的头部随着Dequeue的操作而移动.如果每次Dequeue都将整个队列的内容前移一个单元,将是一个O(n)复杂度的操作,对于删除操作而言…
今天开始学习常量,变量,基本数据类型,printf()函数和scanf()函数,算术运算符. 首先常量:是在程序中保持不变的量 变量:编写程序时,常常需要将数据存储在内存中,方便后面使用这个数据或者修改这个数据的值.通常使用变量来存储数据.使用变量可以引用存储在内存中的数据,并随时根据需         要显示数据或执行数据操纵. 声明和使用变量 声明变量: Datatype variablename; 数据类型加上变量名: 定义时初始化变量: Datatype variablename = v…
集合 集合(set)是一种包含不同元素的数据结构. 集合中的元素称为成员. 集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在. code function Set(){ var me = this; me.dataStore = []; me.add = add; me.remove =remove; me.size = size; me.union = union; me.intersect = intersect; me.subset = subset; m…
说明:部分代码参考了Harrytsz的文章:https://blog.csdn.net/Harrytsz/article/details/86645857 巩固 R-1.1 编写一个Python函数 is_multiple(n, m),用来接收两个整数值 n 和 m,如果 n 是 m 的倍数,即存在整数 i 使得 n = mi,那么函数返回 True,否则返回 False. R-1.2 编写一个Python函数 is_even(k),用来接收一个整数 k,如果 k 是偶数返回 True,否则返回…
一.二维数组 (1)二维数组的列是固定时,行未知时使用动态分配 当一个二维数组每一维的大小在编译时都是已知时,可以采用类似于创建一维数组的语法 来创建二维数组.例如,一个类型为char的7×5数组可用如下语法来定义: char c[7][5]; 如果在编译时至少有一维是未知的,必须在运行时使用操作符new来创建该数组.一个二 维字符型数组,假定在编译时已知其列数为5,可采用如下语法来分配存储空间: #include<exception> #include<iostream> usi…
2.3 常量 strlen函数:返回s的长度 int strlenn(char s[]) { int i=0; while(s[i] != '\0') ++i; return i; } 2.7 类型转换 atoi函数:将字符串s转换为相应的整型 int atoi(char s[]) { int n = 0; for (int i = 0; s[i] >= '0' && s[i] <= '9'; i++) n = 10*n + (s[i] - '0'); return n; }…