java数据结构算法实现

java数据结构算法实现
java数据结构算法实现

1.大O表示法:粗略的量度方法即算法的速度是如何与数据项的个数相关的

算法大O表示法表示的运行时间

线性查找O(N)

二分查找O(logN)

无序数组的插入O(1)

有序数组的插入O(N)

无序数组的删除O(N)

有序数组的删除O(N)

O(1)是最优秀的,O(logN)良好,O(N)还可以,O(N2)稍差(在冒泡法中见到)

2.排序

public class JWzw {

//插入排序

public void insertArray(Integer []in){

int tem = 0;

int num = 0;

int upnum = 0;

for (int i = 0; i < in.length; i++) {

for (int j = i - 1; j >= 0; j--) {

num++;

if (in[j+1] < in[j]) {

tem = in[j+1];

in[j+1] = in[j];

in[j] = tem;

upnum++;

}

else

{

break;

}

}

}

for (int i = 0; i < in.length; i++) {

System.out.print(in[i]);

if(i < in.length - 1)

{

System.out.print(",");

}

}

System.out.println();

System.out.println("插入排序循环次数:" + num);

System.out.println("移动次数:" + upnum);

System.out.print("\n\n\n");

}

//选择排序

public void chooseArray(Integer []in){

int tem = 0;

int num = 0;

int upnum = 0;

for(int i = 0;i < in.length;i++)

{

for(int j = i;j < in.length - 1;j++){

num++;

if(in[j+1] < in[j]){

tem = in[j+1];

in[j + 1] = in[j];

in[j] = tem;

upnum++;

}

}

}

for (int i = 0; i < in.length; i++) {

System.out.print(in[i]);

if(i < in.length - 1)

{

System.out.print(",");

}

}

System.out.println();

System.out.println("选择排序循环次数:" + num);

System.out.println("移动次数:" + upnum);

System.out.print("\n\n\n");

}

//冒泡排序

public void efferArray(Integer []in){

int tem = 0;

int num = 0;

int upnum = 0;

for(int i = 0;i < in.length;i++){

for(int j = i;j < in.length - 1;j++)

{

num++;

if(in[j+1] < in[i]){

tem = in[j+1];

in[j+1] = in[i];

in[i] = tem;

upnum++;

}

}

}

for (int i = 0; i < in.length; i++) {

System.out.print(in[i]);

if(i < in.length - 1)

{

System.out.print(",");

}

}

System.out.println();

System.out.println("冒泡排序循环次数:" + num);

System.out.println("移动次数:" + upnum);

System.out.print("\n\n\n");

}

//打印乘法口诀

public void printMulti(){

for (int j = 1; j < 10; j++) {

for (int i = 1; i <= j; i++) {

System.out.print(i + " * " + j + " = " + j * i + "\t");

}

System.out.print("\t\n");

}

System.out.print("\n\n\n");

}

//打印N * 1 + N * 2 + N * 3 =num的所有组合

public void printNumAssemble(int num){

for (int i = 0; i < num + 1; i++) {

for (int j = 0; j < num / 2 +1; j++) {

for (int in = 0; in < num / 3 + 1; in++) {

if (i * 1 + j * 2 + in * 3 == num) {

System.out.println("小马" + i + ",\t中马" + j + ",\t大马" + in);

}

}

}

}

}

/**

*@param args

*/

public static void main(String[] args) {

JWzw jwzw = new JWzw();

int num = 3;

jwzw.printMulti();//打印乘法口诀

jwzw.printNumAssemble(100);//打印N * 1 + N * 2 + N * 3 =num的所有组合

Integer in[] = {8,89,5,84,3,45,12,33,77,98,456,878,654,213,897};

jwzw.efferArray(in);//冒泡排序

Integer in1[] = {8,89,5,84,3,45,12,33,77,98,456,878,654,213,897};

jwzw.insertArray(in1);//插入排序

Integer in2[] = {8,89,5,84,3,45,12,33,77,98,456,878,654,213,897};

jwzw.chooseArray(in2);//选择排序

//int i = num++;

//System.out.println(i);

System.out.println(1000>>2);

}

}

3.优先级队列

class PriorityQueue {

private long[] a = null;

private int nItems = 0;

private int maxSize = 0;

public PriorityQueue(int maxSize) {

a = new long[maxSize];

this.maxSize = maxSize;

nItems = 0;

}

public void insert(long l) {

//优先级队列的插入不是队尾,而是选择一个合适的按照某种顺序插入的

//当队列长度为0时,如下

//不为0时,将所有比要插入的数小的数据后移,这样大的数就在队列的头部了int i = 0;

if(nItems == 0) {

a[0] = l;

} else {

for(i=nItems-1; i>=0; i--) {

if(l < a[i])

a[i+1] = a[i];

else

break;

}

a[i+1] = l;

}

nItems++;

}

public long remove() {

//移出的是数组最上端的数,这样减少数组元素的移动

return a[--nItems];

}

public boolean isEmpty() {

return (nItems == 0);

}

public boolean isFull() {

return (nItems == maxSize);

}

public int size() {

return nItems;

}

}

public class duilie {// 队列体类

private duilie s;

private String data;

duilie(String data) {

this.data = data;

}

public String getData() {

return data;

}

public void setData(String data) {

this.data = data;

}

public duilie getS() {

return s;

}

public void setS(duilie s) {

this.s = s;

}

}

public class duiliecz {// 队列操作类

/**

*@param args

*/

private int i = 0;// 队列长

private duilie top = new duilie("");// 队列头private duilie end = new duilie("");// 队列尾public void add(String s) {// 添加队列

duilie m = new duilie(s);

if (i != 0) {

m.setS(top.getS());

top.setS(m);

} else {

top.setS(m);

end.setS(m);

}

i++;

}

4.队列

public void del() {// 删除队尾

if (i == 0) {

return;

} else if (i == 1) {

top.setS(null);

end.setS(null);

} else {

duilie top1 = new duilie("");// 队列底查找用缓存

top1.setS(top.getS());

while (!top1.getS().getS().equals(end.getS())) { top1.setS(top1.getS().getS());

}

end.setS(top1.getS());

}

i--;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

duiliecz m = new duiliecz();

m.add("1");

m.add("2");

m.add("3");

m.add("4");

for (int n = 0; n < 4; n++) {

m.del();

}

}

public int getI() {

return i;

}

public duilie getEnd() {

return end;

}

public duilie getTop() {

return top;

}

}

5.栈

public class Stack {

int[] arr;

int len = 0;

public Stack() {

arr = new int[100];

}

public Stack(int n) {

arr = new int[n];

}

public int size() {

return len + 1;

}

// 扩大数组

public void resize() {

int[] b = new int[arr.length * 2];

System.arraycopy(arr, 0, b, 0, arr.length);

arr = b;

}

public void show() {

for (int i = 0; i < len; i++) {

System.out.print(arr[i] + " ");

}

System.out.println();

}

// 进栈

public void push(int a) {

if (len >= arr.length)

resize();

arr[len] = a;

len++;

}

// 出栈

public int pop() {

if (len == 0) {

System.out.println();

System.out.println("stack is empty!");

return -1;

}

int a = arr[len - 1];

arr[len - 1] = 0;

len--;

return a;

}

}

6.链表

class Node {

Object data;

Node next;

public Node(Object data) {

setData(data);

}

public void setData(Object data) {

this.data = data;

}

public Object getData() {

return data;

}

}

class Link {

Node head;

int size = 0;

public void add(Object data) {

Node n = new Node(data);

if (head == null) {

head = n;

} else {

Node current = head;

while (true) {

if (current.next == null) {

break;

}

current = current.next;

}

current.next = n;

}

size++;

}

public void show() {

Node current = head;

if (current != null) {

while (true) {

System.out.println(current);

if (current == null) {

break;

}

current = current.next;

}

} else {

System.out.println("link is empty");

}

}

public Object get(int index) {

// ....

}

public int size() {

return size;

}

}

7.单链表

class Node // 节点类,单链表上的节点

{

String data; // 数据域,存放String类的数据

Node next; // 指向下一个节点

Node(String data) {

this.data = data; // 构造函数

}

String get() {

return data; // 返回数据

}

}

class MyLinkList // 链表类

{

Node first; // 头节点

int size; // 链表长度

MyLinkList(String arg[]) {

// Node first = new Node("head");//生成头节点

first = new Node("head"); // J.F. 这里不需要定义局部变量 first

// 如果定义了局部变量,那成员变量 first 就一直没有用上

// 所以,它一直为空

size = 0;

Node p = first;

for (int i = 0; i < arg.length; i++) // 将arg数组中的元素分别放入链表中{

Node q = new Node(arg[i]);

q.next = p.next; // 每一个节点存放一个arg数组中的元素

p.next = q;

p = p.next;

size++;

}

}

MyLinkList() // 无参数构造函数

{

// Node first = new Node("head");

first = new Node("head"); // J.F. 这里犯了和上一个构造方法同样的错误

size = 0;

}

int size() // 返回链表长度

{

return size;

}

void insert(Node a, int index) // 将节点a 插入链表中的第index个位置

{

Node temp = first;

for (int i = 0; i < index; i++) {

temp = temp.next;// 找到插入节点的前一节点

}

a.next = temp.next; // 插入节点

temp.next = a;

size++;

}

Node del(int index) // 删除第index个节点,并返回该值

{

Node temp = first;

for (int i = 0; i < index; i++) {

temp = temp.next;// 找到被删除节点的前一节点

}

Node node = temp.next;

temp.next = node.next;

size--; // 删除该节点,链表长度减一

return node;

}

void print() // 在屏幕上输出该链表(这段程序总是出错,不知道错在哪里){

Node temp = first;

for (int i = 1; i < size; i++) // 将各个节点分别在屏幕上输出

{

temp = temp.next;

System.out.print(temp.get() + "->");

}

}

void reverse() // 倒置该链表

{

for (int i = 0; i < size; i++) {

insert(del(size - 1), 0); // 将最后一个节点插入到最前

// J.F. 最后一个节点的 index 应该是 size - 1

// 因为第一个节点的 index 是 0

}

}

String get(int index) // 查找第index个节点,返回其值

{

if (index >= size) {

return null;

}

Node temp = first;

for (int i = 0; i < index; i++) {

temp = temp.next;// 找到被查找节点的前一节点

}

return temp.next.get();

}

}

class MyStack // 堆栈类,用单链表实现

{

MyLinkList tmp;

Node temp;

MyStack() {

// MyLinkList tmp = new MyLinkList();

tmp = new MyLinkList(); // J.F. 和 MyLinkList 构造方法同样的错误}

void push(String a) // 压栈,即往链表首部插入一个节点

{

Node temp = new Node(a);

tmp.insert(temp, 0);

}

String pop() // 出栈,将链表第一个节点删除

{

Node a = tmp.del(0);

return a.get();

}

int size() {

return tmp.size();

}

boolean empty() // 判断堆栈是否为空

{

if (tmp.size() == 0)

return false;

else

return true;

}

}

public class MyLinkListTest // 测试程序部分

{

public static void main(String arg[]) // 程序入口

{

if ((arg.length == 0) || (arg.length > 10))

System.out.println("长度超过限制或者缺少参数");

else {

MyLinkList ll = new MyLinkList(arg); // 创建一个链表

ll.print(); // 先输出该链表(运行到这一步抛出异常)

ll.reverse(); // 倒置该链表

ll.print(); // 再输出倒置后的链表

String data[] = new String[10];

int i;

for (i = 0; i < ll.size(); i++) {

data[i] = ll.get(i); // 将链表中的数据放入数组

}

// sort(data);// 按升序排列data中的数据(有没有现成的排序函数?)

for (i = 0; i < ll.size(); i++) {

System.out.print(data[i] + ";"); // 输出数组中元素

}

System.out.println();

MyStack s = new MyStack(); // 创建堆栈实例s

for (i = 0; i < ll.size(); i++) {

s.push(data[i]); // 将数组元素压栈

}

while (!s.empty()) {

System.out.print(s.pop() + ";"); // 再将堆栈里的元素弹出}

}

}

}

8.双端链表

class Link {

public int iData = 0;

public Link next = null;

public Link(int iData) {

this.iData = iData;

}

public void display() {

System.out.print(iData + " ");

}

}

class FirstLastList {

private Link first = null;

private Link last = null;

public FirstLastList() {

first = null;

last = null;

}

public void insertFirst(int key) {

Link newLink = new Link(key);

if (this.isEmpty())

last = newLink;

newLink.next = first;

first = newLink;

}

public void insertLast(int key) {

Link newLink = new Link(key);

if (this.isEmpty())

first = newLink;

else

last.next = newLink;

last = newLink;

}

public Link deleteFirst() {

Link temp = first;

if (first.next == null)

last = null;

first = first.next;

return temp;

}

public boolean isEmpty() {

return (first == null);

}

public void displayList() {

System.out.print("List (first-->last): ");

Link current = first;

while (current != null) {

current.display();

current = current.next;

}

System.out.println("");

}

}

class FirstLastListApp {

public static void main(String[] args) {

// TODO Auto-generated method stub

FirstLastList theList = new FirstLastList();

theList.insertFirst(22); // insert at front

theList.insertFirst(44);

theList.insertFirst(66);

theList.insertLast(11); // insert at rear

theList.insertLast(33);

theList.insertLast(55);

theList.displayList(); // display the list

theList.deleteFirst(); // delete first two items

theList.deleteFirst();

theList.displayList(); // display again }

}

9.有序链表

package arithmetic;

class Link {

public int iData = 0;

public Link next = null;

public Link(int iData) {

this.iData = iData;

}

public void display() {

System.out.print(iData + " ");

}

}

class SortedList {

private Link first = null;

public SortedList() {

first = null;

}

public void insert(int key) {

Link newLink = new Link(key);

Link previous = null;

Link current = first;

// while的第一个条件是没有到达链表的尾端,第二个是按顺序找到一个合适的位置

while (current != null && key > current.iData) {

previous = current;

current = current.next;

}

// 如果是空表或者要插入的元素最小,则在表头插入key

if (current == first)

first = newLink;

else

previous.next = newLink;

newLink.next = current;

}

/**

*删除表头的节点

*

*@return要删除的节点

*/

public Link remove() {

Link temp = first;

first = first.next;

return temp;

}

public boolean isEmpty() {

return (first == null);

}

public void displayList() {

System.out.print("List (first-->last): ");

Link current = first; // start at beginning of list

while (current != null) // until end of list,

{

current.display(); // print data

current = current.next; // move to next link

}

System.out.println("");

}

}

class SortedListApp {

public static void main(String[] args) { // create new list SortedList theSortedList = new SortedList();

theSortedList.insert(20); // insert 2 items

theSortedList.insert(40);

theSortedList.displayList(); // display list

theSortedList.insert(10); // insert 3 more items

theSortedList.insert(30);

theSortedList.insert(50);

theSortedList.displayList(); // display list

theSortedList.remove(); // remove an item

theSortedList.displayList(); // display list }

}

10.双向链表

class Link {

// 双向链表,有两个指针,一个向前,一个向后

public int iData = 0;

public Link previous = null;

public Link next = null;

public Link(int iData) {

this.iData = iData;

}

public void display() {

System.out.print(iData + " ");

}

}

class DoublyLinked {

// 分别指向链表的表头和表尾

private Link first = null;

private Link last = null;

public boolean isEmpty() {

return first == null;

}

/**

*在表头插入数据

*

*@param要插入的节点的数据

*/

public void insertFirst(int key) {

Link newLink = new Link(key);

// 如果开始链表为空,则插入第一个数据后,last也指向第一个数据if (this.isEmpty())

last = newLink;

else {// 表不为空的情况

first.previous = newLink;

newLink.next = first;

}

// 无论怎样,插入后都的让first重新指向第一个节点

first = newLink;

}

public void insertLast(int key) {// 在尾端插入数据,同上Link newLink = new Link(key);

if (this.isEmpty())

first = newLink;

else {

last.next = newLink;

newLink.previous = last;

}

last = newLink;

}

/**

*在指定的节点后插入数据

*

*@param key

*指定的节点的值

*@param iData

*要插入的数据

*@return是否插入成功

*/

public boolean insertAfter(int key, int iData) { Link newLink = new Link(key);

Link current = first;

// 从first开始遍历,看能否找到以key为关键字的节点

while (current.iData != key) {

current = current.next;

// 若能找到就跳出循环,否则返回false,插入失败

if (current == null)

return false;

}

// 如果插入点在last的位置

if (current == last) {

last = newLink;

} else {// 非last位置,交换各个next和previous的指针newLink.next = current.next;

current.next.previous = newLink;

}

current.next = newLink;

newLink.previous = current;

return true;

}

/**

*删除表头的节点

*

*@return

*/

public Link deleteFirst() {

Link temp = first;

// 如果表中只有一个元素,删除后则为空表,所以last=null if (first.next == null)

last = null;

else

// 否则,让第二个元素的previous=null

first.next.previous = null;

// 删除头指针,则first指向原来的second

first = first.next;

return temp;

}

public Link deleteLast() {// 同上

Link temp = last;

if (last.previous == null)

first = null;

else

last.previous.next = null;

last = last.previous;

return temp;

}

public Link deleteKey(int key) {

Link current = first;

// 遍历整个链表查找对应的key,如果查到跳出循环,否则...

while (current.iData != key) {

Java数据结构和算法

Java数据结构和算法 一、数组于简单排序 (1) 二、栈与队列 (4) 三、链表 (7) 四、递归 (22) 五、哈希表 (25) 六、高级排序 (25) 七、二叉树 (25) 八、红—黑树 (26) 九、堆 (36) 十、带权图 (39) 一、数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。 一维数组 一维数组(one-dimensional array )实质上是相同类型变量列表。要创建一个数组,你必须首先定义数组变量所需的类型。通用的一维数组的声明格式是:type var-name[ ]; 获得一个数组需要2步。第一步,你必须定义变量所需的类型。第二步,你必须使用运算符new来为数组所要存储的数据分配内存,并把它们分配给数组变量。这样Java 中的数组被动态地分配。如果动态分配的概念对你陌生,别担心,它将在本书的后面详细讨论。 数组的初始化(array initializer )就是包括在花括号之内用逗号分开的表达式的列表。逗号分开了数组元素的值。Java 会自动地分配一个足够大的空间来保存你指定的初始化元素的个数,而不必使用运算符new。 Java 严格地检查以保证你不会意外地去存储或引用在数组范围以外的值。Java 的运行系统会检查以确保所有的数组下标都在正确的范围以内(在这方面,

Java 与C/C++ 从根本上不同,C/C++ 不提供运行边界检查)。 多维数组 在Java 中,多维数组(multidimensional arrays )实际上是数组的数组。你可能期望,这些数组形式上和行动上和一般的多维数组一样。然而,你将看到,有一些微妙的差别。定义多维数组变量要将每个维数放在它们各自的方括号中。例如,下面语句定义了一个名为twoD 的二维数组变量。 int twoD[][] = new int[4][5]; 简单排序 简单排序中包括了:冒泡排序、选择排序、插入排序; 1.冒泡排序的思想: 假设有N个数据需要排序,则从第0个数开始,依次比较第0和第1个数据,如果第0个大于第1个则两者交换,否则什么动作都不做,继续比较第1个第2个…,这样依次类推,直至所有数据都“冒泡”到数据顶上。 冒泡排序的的java代码: Public void bubbleSort() { int in,out; for(out=nElems-1;out>0;out--) for(in=0;ina[in+1]) Swap(in,in+1); } } 算法的不变性:许多算法中,有些条件在算法执行过程中始终是不变的。这些条件被称为算法的不变性,如果不变性不为真了,则标记出错了; 冒泡排序的效率O(N*N),比较N*N/2,交换N*N/4; 2. 选择排序的思想:

数据结构与算法基础知识总结

数据结构与算法基础知识总结 1 算法 算法:是指解题方案的准确而完整的描述。 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义; (4)拥有足够的情报。 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 指令系统:一个计算机系统能执行的所有指令的集合。 基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。 2 数据结构的基本基本概念 数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; (2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。 数据结构是指相互有关联的数据元素的集合。 数据的逻辑结构包含: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。 数据的存储结构有顺序、链接、索引等。 线性结构条件:

(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 非线性结构:不满足线性结构条件的数据结构。 3 线性表及其顺序存储结构 线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。 在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。 非空线性表的结构特征: (1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。 线性表的顺序存储结构具有以下两个基本特点: (1)线性表中所有元素的所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ai的存储地址为:adr(ai)=adr(a1)+(i-1)k,,adr(a1)为第一个元素的地址,k代表每个元素占的字节数。 顺序表的运算:插入、删除。(详见14--16页) 4 栈和队列 栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。 栈按照“先进后出”(filo)或“后进先出”(lifo)组织数据,栈具有记忆作用。用top表示栈顶位置,用bottom表示栈底。 栈的基本运算:(1)插入元素称为入栈运算;(2)删除元素称为退栈运算;(3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。 队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。rear指针指向队尾,front指针指向队头。 队列是“先进行出”(fifo)或“后进后出”(lilo)的线性表。 队列运算包括(1)入队运算:从队尾插入一个元素;(2)退队运算:从队头删除一个元素。循环队列:s=0表示队列空,s=1且front=rear表示队列满

数据结构复习资料,java数据结构期末考试

第二章算法分析 1.算法分析是计算机科学的基础 2.增长函数表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度或空间复杂度。增长函数表示与该问题大小相对应的时间或空间的使用 3.渐进复杂度:随着n的增加时增长函数的一般性质,这一特性基于该表达式的主项,即n 增加时表达式中增长最快的那一项。 4.渐进复杂度称为算法的阶次,算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出来的。算法的阶次为增长函数提供了一个上界。 5.渐进复杂度:增长函数的界限,由增长函数的主项确定的。渐进复杂度类似的函数,归为相同类型的函数。 6.只有可运行的语句才会增加时间复杂度。 7. O() 或者大O记法:与问题大小无关、执行时间恒定的增长函数称为具有O(1)的复杂度。 增长函数阶次 t(n)=17 O(1) t(n)=3log n O(log n) t(n)=20n-4 O(n) t(n)=12n log n + 100n O(n log n) t(n)=3n2+ 5n - 2 O(n2) t(n)=8n3+ 3n2O(n3) t(n)=2n+ 18n2+3n O(2n) 8.所有具有相同阶次的算法,从运行效率的角度来说都是等价的。 9.如果算法的运行效率低,从长远来说,使用更快的处理器也无济于事。 10.要分析循环运行,首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。(n 表示的是问题的大小) 11.分析嵌套循环的复杂度时,必须将内层和外层循环都考虑进来。 12.方法调用的复杂度分析: 如:public void printsum(int count){ int sum = 0 ; for (int I = 1 ; I < count ; I++) sum += I ; System.out.println(sun); } printsum方法的复杂度为O(n),计算调用该方法的初始循环的时间复杂度,只需把printsum方法的复杂度乘以该循环运行的次数即可。所以调用上面实现的printsum方法的复 杂度为O(n2)。 13指数函数增长> 幂函数增长> 对数函数增长

数据结构与算法第1章参考答案

习题参考答案 一.选择题 1.从逻辑上可以把数据结构分为(C)两大类。 A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构 2.在下面的程序段中,对x的斌值语句的频度为(C)。 for( t=1;k<=n;k++) for(j=1;j<=n; j++) x=x十1; A. O(2n) B. O (n) C. O (n2). D. O(1og2n) 3.采用链式存储结构表示数据时,相邻的数据元素的存储地址(C)。 A.一定连续B.一定不连续 C.不一定连续 D.部分连续,部分不连续 4.下面关于算法说法正确的是(D)。 A.算法的时间复杂度一般与算法的空间复杂度成正比 B.解决某问题的算法可能有多种,但肯定采用相同的数据结构 C.算法的可行性是指算法的指令不能有二义性 D.同一个算法,实现语言的级别越高,执行效率就越低 5.在发生非法操作时,算法能够作出适当处理的特性称为(B)。 A.正确性 B.健壮性 C.可读性 D.可移植性 二、判断题 1.数据的逻辑结构是指数据的各数据项之间的逻辑关系。(√) 2.顺序存储方式的优点是存储密度大,且插人、删除运算效率高。(×) 3.数据的逻辑结构说明数据元素之间的次序关系,它依赖于数据的存储结构。(×) 4.算法的优劣与描述算法的语言无关,但与所用计算机的性能有关。(×) 5.算法必须有输出,但可以没有输人。(√) 三、筒答题 1.常见的逻辑结构有哪几种,各自的特点是什么?常用的存储结构有哪几种,各自的特点是什么? 【答】常见的四种逻辑结构: ①集合结构:数据元素之间是“属于同一个集合” ②线性结构:数据元素之间存在着一对一的关系 ③树结构:数据元素之间存在着一对多的关系 ④结构:数据元素之间存在着多对多的关系。 常见的四种存储结构有: ①顺序存储:把逻辑上相邻的元素存储在物理位置相邻的存储单元中。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。 ②链接存储:对逻辑上相邻的元素不要求物理位置相邻的存储单元,元素间的逻辑关系通过附设的指针域来表示。 ③索引存储:通过建立索引表存储结点信息的方法,其中索引表一般存储结点关键字和一个地点信息,可通过该地址找到结点的其他信息。 ④散列存储:根据结点的关键字直接计算出该结点的存储地址的方法。 2.简述算法和程序的区别。 【解答】一个算法若用程序设计语言来描述,则它就是一个程序。算法的含义与程序十分相

算法与数据结构复习资料

算法与数据结构复习资料 一、单选题 在一个带有附加表头结点的单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( B)。 A. HL=p;p->next=HL; B.p->next=HL->next;HL->next=p; C.p->next=HL;p=HL; D.p->next=HL;HL=p; 若顺序存储的循环队列的QueueMaxSize=n,则该队列最多可存储(B)个元素. A. n B.n-1 C.n+1 D.不确定 下述哪一条是顺序存储方式的优点?(A) A.存储密度大B.插入和删除运算方便 C. 获取符合某种条件的元素方便 D.查找运算速度快 设有一个二维数组A[m][n],假设A[0][0]存放位置在600 (10),A[3][3]存放位置在678 (10) , 每个元素占一个空间,问A[2][3] (10)存放在什么位置?(脚注 (10) 表示用10进制表示,m>3)C A.658 B.648 C.633 D.653 下列关于二叉树遍历的叙述中,正确的是( D) 。 A. 若一个树叶是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序遍历最后一个结点 B.若一个点是某二叉树的前序遍历最后一个结点,则它必是该二叉树的中序遍历的最后一个结点 C.若一个结点是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序最后一个结点 D.若一个树叶是某二叉树的前序最后一个结点,则它必是该二叉树的中序遍历最后一个结点 k层二叉树的结点总数最多为(A). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 对线性表进行二分法查找,其前提条件是( C). A.线性表以链接方式存储,并且按关键码值排好序 B.线性表以顺序方式存储,并且按关键码值的检索频率排好序 C. 线性表以顺序方式存储,并且按关键码值排好序 D. 线性表以链接方式存储,并且按关键码值的检索频率排好序 对n个记录进行堆排序,所需要的辅助存储空间为(C) A. O(1og2n) B. O(n) C. O(1) D.O(n2) 对于线性表(7,34,77,25,64,49,20,14)进行散列存储时,若选用H(K)=K%7作为散列函数,则散列地址为0的元素有(D)个, A.1 B.2 C.3 D.4 下列关于数据结构的叙述中,正确的是( D). A. 数组是不同类型值的集合 B. 递归算法的程序结构比迭代算法的程序结构更为精炼 C. 树是一种线性结构 D. 用一维数组存储一棵完全二叉树是有效的存储方法 在决定选取何种存储结构时,一般不考虑( A )。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是(B)。A.单链表B.静态链表C.线性链表D.顺序存储结构 设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序列为(A)。 A.q=p->next;p->data=q->data;p->next=q->next;free(q); B.q=p->next;q->data=p->data;p->next=q->next;free(q); C.q=p->next;p->next=q->next;free(q);

数据结构与算法(JAVA语言版)_

目录 第一章 Java 与面向对象程序设计........................................................................................1 Java 语言基础知识....................................................................................................1 基本数据类型及运算.......................................................................................1 流程控制语句...................................................................................................3 字符串...............................................................................................................3 数组...................................................................................................................5 Java 的面向对象特性................................................................................................7 类与对象...........................................................................................................7 继承...................................................................................................................9 接口.................................................................................................................10 异常.........................................................................................................................11 Java 与指针..............................................................................................................12 数据结构与算法基础.............................................................................................15 数据结构.................................................................................................................15 基本概念.........................................................................................................15 抽象数据类型.................................................................................................17 小结.................................................................................................................19 算法及性能分析.....................................................................................................19 算法.................................................................................................................19 时间复杂性.....................................................................................................20 空间复杂性.....................................................................................................24 算法时间复杂度分析.....................................................................................25 最佳、最坏与平均情况分析.........................................................................27 均摊分析.........................................................................................................29 线性表.....................................................................................................................32 线性表及抽象数据类型.........................................................................................32 线性表定义.....................................................................................................32 线性表的抽象数据类型.................................................................................32 List 接口 ..........................................................................................................34 Strategy 接口 ...................................................................................................35 线性表的顺序存储与实现.....................................................................................36 线性表的链式存储与实现.....................................................................................42 单链表.............................................................................................................42 双向链表.........................................................................................................46 线性表的单链表实现.....................................................................................48 两种实现的对比.....................................................................................................53 基于时间的比较.............................................................................................53 基于空间的比较.............................................................................................53 链接表.....................................................................................................................54 基于结点的操作.............................................................................................54 链接表接口.....................................................................................................54 基于双向链表实现的链接表.........................................................................56 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.2 1.2.1 1.2.2 1.2.3 1.3 1.4 第二章 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 第三章 3.1 3.1.1 3.1.2 3.1.3 3.1.4 3.2 3.3 3.3.1 3.3.2 3.3.3 3.4 3.5 3.4.1 3.4.2 3.5.1 3.5.2 3.5.3

数据结构与算法复习题及参考答案

复习题集─参考答案 一判断题 (√)1. 在决定选取何种存储结构时,一般不考虑各结点的值如何。 (√)2. 抽象数据类型与计算机部表示和实现无关。 (×)3. 线性表采用链式存储结构时,结点和结点部的存储空间可以是不连续的。 (×)4. 链表的每个结点中都恰好包含一个指针。 (×)5.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。(×)6. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (×)7. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (×)8. 线性表在物理存储空间中也一定是连续的。 (×)9. 顺序存储方式只能用于存储线性结构。 (√)10.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)11.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 (√)12.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)13.两个栈共享一片连续存空间时,为提高存利用率,减少溢出机会,应把两个栈的栈底分别设在这片存空间的两端。 (×)14.二叉树的度为2。 (√)15.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 (×)16.二叉树中每个结点的两棵子树的高度差等于1。 (√)17.用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (√)18.具有12个结点的完全二叉树有5个度为2的结点。 (√)19.二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 (×)20.在冒泡法排序中,关键值较小的元素总是向前移动,关键值较大的元素总是向后移动。 (×)21.计算机处理的对象可以分为数据和非数据两大类。[计算机处理的对象都是数据] (×)22.数据的逻辑结构与各数据元素在计算机中如何存储有关。 (×)23.算法必须用程序语言来书写。 (×)24.判断某个算法是否容易阅读是算法分析的任务之一。 (×)25.顺序表是一种有序的线性表。[任何数据结构才用顺序存储都叫顺序表] (√)26.分配给顺序表的存单元地址必须是连续的。 (√)27.栈和队列具有相同的逻辑特性。[它们的逻辑结构都是线性表] (√)28.树形结构中每个结点至多有一个前驱。 (×)29.在树形结构中,处于同一层上的各结点之间都存在兄弟关系。 (×)30.如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。 (×)31.如果表示图的邻接矩阵是对称矩阵,则该图一定是有向图。 (×)32.顺序查找方法只能在顺序存储结构上进行。 (×)33.折半查找可以在有序的双向链表上进行。

数据结构与算法知识点必备

数据结构与方法 1、算法的基本特征:可行性、确定性、有穷性、拥有足够的情报 2、算法的基本运算与操作:算术运算、逻辑运算、关系运算、数据传输 3、算法的基本控制结构:顺序结构、选择结构、循环(重复)结构 4、算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法 5、算法的复杂度主要包括:时间复杂度、空间复杂度 6、算法的时间复杂度:指执行算法所需要的计算工作量 7、算法的空间复杂度:指执行这个算法所需要的内存空间 8、数据结构主要研究:数据的逻辑结构、数据的存储结构、对各种数据结构进行的运算 9、数据结构研究的目的:提高数据处理的效率 10、数据处理的效率:数据处理的速度、减少处理过程中占用计算机的存储空间 11、数据处理:指对数据集合中的各元素以各种方式进行运算 12、数据元素:指在数据处理中,每一个需要处理的对象都可以抽象成数据元素 13、数据结构:指反映数据元素之间关系的数据元素集合的表示 14、数据的逻辑结构:指反映数据元素之间逻辑关系的数据结构,两要素:数据元素的集合、数据元素在集合上的关系 15、数据的存储结构:指数据的逻辑结构在计算机存储空间的存放形式,常用的存储结构有:顺序、链接、索引等 16、数据结构的图形表示中每个元素加上方框成为结点 17、数据结构一般分为:线性结构、非线性结构 18、线性结构满足:有且仅有一个根结点、每个结点最多有一个前件与后件、在一个线性结构中插入与删除任何一个结点后还就是线性结构 19、线性表定义:线性表就是由n个数据元素a1、a2、a3、a4……an组成的一个有限序列,表中每一个数据元素,除了第一个外,有且仅有一个前件,除了最后一个外,有且仅有一个后件20、非线性表的特征:有且只有一个根节点a1,它无前件、有且只有一个终结点an,它无后件、除了第一个与最后一个外,其她所有结点只有一个前件与一个后件 21、线性表的长度:线性表中的结点的个数n成为线性表的长度,当n=0时,成为空表 22、线性表的顺序存储的特点:所有元素所占的存储空间就是连续的、各数据元素在存储空间中就是按逻辑顺序一次存放的 23、线性表的随机存取地址计算公式:ADD(ai)=ADD(a1)+(i-1)*k 24、线性表的主要操作:插入、删除、查找、排序、分解、合并、复制、逆转 25、栈的定义:栈就是限定在一端进行插入与删除的线性表,它按照“先进后出,后进先出”的原则组织数据 26、栈的顺序存储:在程序设计语言中,一般一维数组S(1:m)作为栈的顺序存储空间,其中m 为栈的最大容量 27、栈的基本运算:入栈、退栈、读栈顶元素 28、入栈运算:首先将栈顶指针(top)加1,然后将新元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,称为“上溢”错误 29、退栈运算:首先将栈顶元素赋给一个指定的变量,然后将栈顶指针(top)减1。当栈顶指针为0时,说明栈空,成为“下溢”错误 30、队列的定义:队列就是指允许在一端进行插入,而在另一端进行删除的线性表,它按照“先进先出”的原则组织数据 31、循环队列:在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,

数据结构与算法设计知识点

数据结构与算法设计知识点 试题类型: 本课程为考试科目(闭卷笔试),试题类型包括:概念填空题(10 %),是非判断题(10 %),单项选择题(40 %),算法填空题(10%),算法应用题(20 %),算法设计题(10 %)。 第一章绪论 重点内容及要求: 1、了解与数据结构相关的概念(集合、数据、数据元素、数据项、关键字、元 素之间的关系等)。 数据:所有能被输入到计算机中,且能被计算机处理的符号的 集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定 的符号表示形式。 数据元素:是数据(集合)中的一个“个体”,数据结构中的基本 单位,在计算机程序中通常作为一个整体来考虑和处理。 数据项:是数据结构中讨论的最小单位,数据元素可以是一个或 多个数据项的组合 关键码:也叫关键字(Key),是数据元素中能起标识作用的数 据项。 其中能起到唯一标识作用的关键码称为主关键码(简称主码); 否则称为次关键码。通常,一个数据元素只有一个主码,但可以有多 个次码。 关系:指一个数据集合中数据元素之间的某种相关性。 数据结构:带“结构”的数据元素的集合。这里的结构指元素之 间存在的关系。 数据类型:是一个值的集合和定义在此集合上的一组操作的总

称。 2、掌握数据结构的基本概念、数据的逻辑结构(四种)和物理结构(数据元素 的表示与关系的表示、两类存储结构:顺序存储结构和链式存储结构)。 数据结构包括逻辑结构和物理结构两个层次。 数据的逻辑结构:是对数据元素之间存在的逻辑关系的一种抽象的描述,可以用一个数据元素的集合和定义在此集合上的若干关系来表示 逻辑结构有四种:线性结构、树形结构、图状结构、集合结构数据的物理结构:是其逻辑结构在计算机中的表示或实现,因此又称其为存储结构。 存储结构:顺序存储结构和链式存储结构 顺序存储结构:利用数据元素在存储器中相对位置之间的某种特定的关系来表示数据元素之间的逻辑关系; 链式存储结构:除数据元素本身外,采用附加的“指针”表示数据元素之间的逻辑关系。 3、了解算法分析的基本方法,掌握算法时间复杂度相关的概念。 算法:是为了解决某类问题而规定的一个有限长的操作序列 或处理问题的策略 一个算法必须满足以下五个重要特性:1.有穷性2.确定性3.可行性4.有输入5.有输出 设计算法时,通常还应考虑满足以下目标: 1.正确性, 2.可读性, 3.健壮性 4.高效率与低存储量需求

数据结构与算法课程设计程序与报告

数据结构与算法课程设计报告 题目 两两相连的房间问题: 一所奇怪的房子,这所房子里有n个房间,每个房间里有一些门通向别的房间,可是这些门十分奇怪,它们只能从房间a开向房间b,也就是说,一扇从a开向b的门是不能让一个人从b房间走到a房间的。你能计算一下任意两个房间之间都互相相通吗? 问题分析 此程序需要完成如下要求:在这所房子里,从任意一个房间开始,按照开门的方向,均能够找到一个合适的路线,使得一个人能够不重复的到达其他的每一个房间,所以,需以每一个房间都为一次起始点来走向其他的房间,以此来判断这所房子里的任意两个房间之间是否互相相通。 实现本程序需要解决以下问题: 1.如何表示每一个房间,即存储房间的信息,并且还要确定这所房子里的各个房间的位置。 2.各个房间之间的门,以及门是从哪个房间开向哪个房间的该如何表示和存储的。 3.从某一个房间开始,如何走到其他各个房间,即如何对房间进行遍历。 4.为了在遍历过程中,不重复的遍历每一个房间,该如何标记已被遍历过的房间,从而只 访问未走过的房间。 5.最后通过什么的遍历方式才能判断各个房间之间是否互相相通。 数据结构的选择和概要设计 通过对题目要求的理解,我们可以用图来表示这所房子,而房子中的各个房间就相当于图中的各个结点,由于房间的门是有方向的,一扇从a开向b的门是不能让一个人从b房间走到a 房间的,从而可知该图为有向图,那么门就相当于有向图中的弧,从一个门开向另一个门即代表有向图中弧的起始点和终止点。 对于图的存储,我采用邻接表的形式来存储,并将每一个房间进行编号,对于邻接表,则需要定义一个邻接表结点类型、邻接表表头结点类型,通过表头与结点的连接而将有向图中弧的信息存储起来。那么人从任意一个房间走向另一个房间,即相当于有向图中从一个结点按照弧的信息访问其他的结点,可以采用深度优先搜索遍历。如果从每一个结点以起始点开始一次遍历就都能访问到其他结点的话则说明有向图是连通图,即该房子里的各个房间能够互相相通。定义一个全局的整形变量flag,如果是连通图的话则flag=1,否则flag=0。

数据结构与算法基础

数据结构与算法基础 一.判断题: 1.数据元素是数据的最小单位。 2.数据结构是带有结构的数据元素的集合。 3.数据结构、数据元素、数据项在计算机中的映像(或表示)分别称为存储结构、结点、数据域。 4.数据项是数据的基本单位。 5.数据的逻辑结构是指各数据元素之间的逻辑关系,是用户按使用需要而建立的。 6.数据的物理结构是指数据在计算机内实际的存储形式。 7.算法和程序没有区别,所以在数据结构中二者是通用的。 答案: 1.错误 2.正确 3.正确 4.错误 5.正确 6.正确 7.错误 二. 数据结构是研究数据的 A 和 B 以及它们之间的相互关系,并对这种结构定义相应的 C ,设计出相应的 D ,而确保经过这些运算后所得到的新结构是 E 结构类型。 供选择答案: A、B:a理想结构b抽象结构c物理结构d逻辑结构 C、D、E:a运算b算法c结构d规则e现在的f原来的 答案: A:cB;dC:aD:bE:f 三.从供选择的答案中选取正确的答案填在下面叙述中的横线上: 1. A 是描述客观事物的数字、字符以及所能输入到计算机中并被计算机程序加工处理的符号的集合。 2. B 是数据的基本单位,即数据集合中的个体。有时一个 B 由若干个___C____组成,在这种情况下,称 B 为记录。 C 是数据的最小单位。而由记录所组成的线性表为 D 。 3. E 是具有相同特性的数据元素的集合,是数据的子集。 4. F是带有结构特性数据元素的集合。 5. 被计算机加工的数据元素不是孤立无关的,它们彼此之间一般存在着某种联系。通常将数据元素的这种关系称为G。 6. 算法的计算量的大小称为计算的H。 供选择的答案: A-F:a数据元素b符号c记录d文件e数据f数据项g数据对象h关键字i数据结构

数据结构和算法课程设计题目

北方民族大学课程设 计 课程名称: 数据结构与算法 院(部)名称:信息与计算科学学院 组长姓名学号 同组人员姓名 指导教师姓名:纪峰 设计时间:2010.6.7----2009.6.27 一、《数据结构与算法》课程设计参考题目

(一)参考题目一(每位同学选作一个,同组人员不得重复) 1、编写函数实现顺序表的建立、查找、插入、删除运算。 2、编写函数分别实现单链表的建立、查找、插入、删除、逆置算法。 3、编写函数实现双向链表的建立、插入、删除算法。 4、编写函数实现顺序栈的进栈、退栈、取栈顶的算法。 5、编写函数实现链栈的进栈、退栈、取栈顶的算法。 6、编写函数实现双向顺序栈的判空、进栈、出栈算法。 7、编写函数实现循环队列的判队空、取队头元素、入队、出队算法。 8、编写函数实现链环队列的判队空、取队头节点、入队、出队算法。 9、编写函数实现串的,求串长、连接、求字串、插入、删除等运算。 10、分别实现顺序串和链串的模式匹配运算。 11、实现二叉树的建立,前序递归遍历和非递归遍历算法。 12、实现二叉树的建立,中序递归遍历和非递归遍历算法。 13、实现二叉树的建立,后序递归遍历和非递归遍历算法。 14、实现二叉树的中序线索化,查找*p结点中序下的前驱和后继结点。 15、分别以临接表和邻接矩阵作为存储就够实现图的深度优先搜索和广度优先搜索算法。 16、利用线性探测处理冲突的方法实现散列表的查找和插入算法。 (二)参考题目二(每三人一组,任选三个题目完成) 1.运动会分数统计(限1 人完成) 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 功能要求: 1)可以输入各个项目的前三名或前五名的成绩; 2)能统计各学校总分, 3)可以按学校编号或名称、学校总分、男女团体总分排序输出; 4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 5)数据存入文件并能随时查询 6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 输出形式:有合理的提示,各学校分数为整形 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;

全国计算机二级第1章数据结构与算法

考点1 算法的复杂度 【考点精讲】 1.算法的基本概念 计算机算法为计算机解题的过程实际上是在实施某种算法。 算法的基本特征:可行性、确定性、有穷性、拥有足够的情报。 2.算法复杂度 算法复杂度包括时间复杂度和空间复杂度。 名称 描述 时间复杂度 是指执行算法所需要的计算工作量 空间复杂度 是指执行这个算法所需要的内存空间 考点2 逻辑结构和存储结构 【考点精讲】 1.逻辑结构 数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合中的若干关系来表示。数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据结构可以表示成 B=(D,R) 其中B表示数据结构。为了反映D中各数据元素之间的前后件关系,一般用二元组来表示。例如,如果把一年四季看作一个数据结构,则可表示成 B =(D,R) D ={春季,夏季,秋季,冬季} R ={(春季,夏季),(夏季,秋季),(秋季,冬季)} 2.存储结构 数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。 由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接等存

储结构。 顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,结点之间的关系由存储单元的邻接关系来体现。 链式存储结构就是在每个结点中至少包含一个指针域,用指针来体现数据元素之间逻辑上的联系。 考点3 线性结构和非线性结构 【考点精讲】 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。如果一个非空的数据结构满足下列两个条件: (1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 则称该数据结构为线性结构。线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。栈、队列、串等都线性结构。 如果一个数据结构不是线性结构,则称之为非线性结构。数组、广义表、树和图等数据结构都是非线性结构。 考点4 栈 【考点精讲】 1.栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另一端是开口的,允许插入和删除元素。通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。 栈是按照“先进后出”或“后进先出”的原则组织数据的。例如,枪械的子弹匣就可以用来形象的表示栈结构。子弹匣的一端是完全封闭的,最后被压入弹匣的子弹总是最先被弹出,而最先被压入的子弹最后才能被弹出。 2.栈的顺序存储及其运算 栈的基本运算有三种:入栈、退栈与读栈顶元素。 (1)入栈运算:入栈运算是指在栈顶位置插入一个新元素。 (2)退栈运算:退栈是指取出栈顶元素并赋给一个指定的变量。 (3)读栈顶元素:读栈顶元素是指将栈顶元素赋给一个指定的变量。 考点5 队列 【考点精讲】 1.队列的基本概念 队列是只允许在一端进行删除,在另一端进行插入的顺序表,通常将允许删除的这一端称为队头,允许插入的这一端称为队尾。 当表中没有元素时称为空队列。 队列的修改是依照先进先出的原则进行的,因此队列也称为先进先出的线性表,或者后进后出的线性表。例如:火车进遂道,最先进遂道的是火车头,最后是火车尾,而火车出遂道的时候也是火车头先出,最后出的是火车尾。若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头元素),qn为队尾元素。队列中的元素是按照q1,q2,…,qn 的顺序进入的,退出队列也只能按照这个次序依次退出,即只有在q1,q2,…,qn-1 都退队之后,qn才能退出队列。因最先进入队列的元素将最先出队,所以队列具有先进先出的

相关文档
最新文档