计算机科学是通过使用计算机解决各种问题的研究领域。为了使用计算机解决给出的问题,您需要为其设计算法。
算法的效率可以通过数据结构来改善。
选择并实现合适的数据结构和算法来解决特定的编程问题。
一、算法和数据结构简介
二、实现排序算法(选择、冒泡、插入、快排、堆。。。)
三、执行搜索算法
线性搜索
二叉搜索
散列搜索
四、使用链接列表解决编程问题
单链接列表
双链接列表
循环链接列表
五、使用堆栈解决编程中的问题
使用数组实现一个堆栈
使用链接列表实现一个堆栈
六、使用队列解决编程问题
七、使用树结构解决编程问题
八、使用图解决编程问题
一、 算法和数据结构简介
算法:解决问题的逐步程序
算法的5个属性:有限性、明确性、输入、输出、有效性
数据结构:在内存中互相组织各个数据元素的方式
标准数据结构有:数组、链接表、堆栈、队列、树和图表;
当然你也可以创建尽可能多的数据结构。
数据结构的类型:
从物理上分:静态、动态
从逻辑上分:线性结构、树、图、集合
设计算法的技巧:分治法、贪婪法
(1) 分治法
将问题细分为子问题(可使用递归帮助细分)
(2) 贪婪法
每次选择最佳可能选项。因此适用于解决优化问题。
缺:通常找不出全局最优解决方案,会给出最优值的良好近似值。
影响程序效率的因素:包括机器速度、编译器、操作系统、编程语言和输入大小。当然,还有算法喽!
算法消耗的主要资源:
时间:执行算法所需的CPU时间
空间:执行算法所用的内存量
时间/空间权衡:你可以在程序执行速度较慢时可以减少使用的内存或在使用内存的成本高时减少运行的时间。而内存通常感觉可以扩展,因为可以增加计算机的内存量,单时间是不可以扩展的。因此通常考虑时间要比考虑内存的情况多。
算法的总运行时间直接与算法中涉及的比较次数成比例。
算法的增长阶:O(1)< O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2^n) < O(10^n)
二、 实现排序算法
http://blog.csdn.net/crayon_chen/article/details/7700132
三、 执行搜索算法
线性搜索:按顺序逐一比较。
最佳效率O(1),最差O(n);
缺:不适合搜索大列表
二叉搜索:二分法
最佳效率O(1),最差O(logn);
优:适用搜索大列表
缺:前提是列表时排好序的。
散列搜索:
优:明显提高搜索速度
缺:两个键产生相同的散列值,冲突;不能顺序访问散列表中的项。
最佳效率O(1),散列的效率取决于散列函数的质量。
详细信息:http://blog.csdn.net/crayon_chen/article/details/7699183
四、 使用链接列表解决编程问题
链接列表的类型:单链接列表、双链接列表、循环链接列表、双循环链接列表
操作:插入、删除、遍历和搜索
通过定义两个类,在程序中表示链接列表:
Node类的声明:
class Node
{
public int roll_no;
public string name;
public Node next;
}
List类:由对链表的一组操作组成,还包含变量/指针START的声明
class List
{
private Node START;
List() { START = NULL; }
public void addNode(int element) { }
public bool search(int element,ref Node previous,ref Node current) { }
public bool delNode(int element) { }
public void traverse() { }
};
五、使用堆栈解决编程中的问题
使用数组实现一个堆栈
声明一个数组:
int[] Stack=new int[5]; // 需要预先定义大小
声明一个变量来存放堆栈中顶部位置的索引:
int top;
最初,当堆栈为空时,设置:
top = –1
使用数组实现堆栈,大小受到限制
使用链接列表实现一个堆栈
使用链表实现堆栈时,每个数据存放在一个节点上
在链表的开头进行push和pop操作
class Node//节点类定义
{ public int info;
public Node next;
public Node(int i,Node n)
{ info=i;
next=n;
}
}
class Stacks//堆栈类定义
{ Node top;
public Stacks()
{top=null;}
public bool empty() {}
public void push(int element) {}
public void pop() { }
}
堆栈的应用有以下几方面:
实施函数调用
维护程序的撤销操作(UNDO)列表
转换数基
检查表达式中圆括号的嵌套
评估表达式
六、 使用队列解决编程问题
数据添加在末端,删除在前端。
使用数组实现一个队列
使用链接列表实现一个队列
实现链接列表和链接队列有什么不同?
在链接列表中,可以在链接的任意位置插入和删除元素。但在链接队列中,只能一端进行插入和删除操作。更特别的是,只能在队列末端进行插入操作,在队列前端执行删除操作。
队列的应用:
打印机暂存(Printer Spooling)
CPU调度(Scheduling)
邮件服务
键盘缓冲
电梯
By Crayon
数据结构与算法(二):http://blog.csdn.net/crayon_chen/article/details/7700675
数据结构与算法(三):http://blog.csdn.net/crayon_chen/article/details/7700681
数据结构与算法(四):http://blog.csdn.net/crayon_chen/article/details/7700697