第一章
Collections类、泛型类和Timing类概述
1.1群集的定义
群集分为线性群集和非线性群集
购物清单时线性群集,在计算机中,数组是线性群集
非线性群集所包含的元素在群集中没有位置次序之分,组织结构图就像用架子垒好的台球一样,在计算机中,树、堆、图和集都是非线性群集
无论是线性还是非线性群集都拥有一套定义好的属性和操作的集合。群集count 是属性,操作即方法包括Add、Insert、remove、clear、contains、indexof。
1.2群集的描述
1.2.1直接存取群集
数组、字符串、结构
结构是一种复合的数据类型,例如一个雇员记录就是由雇员的姓名(字符串)、薪水(整数)、工号(字符串或整数)以及其他属性组成的。由于把这些数据的值分别存储在分散的变量内是很容易产生混淆的,所以变成语言采用结构来存储此类数据。
1.2.2顺序存取群集
线性表:购物清单
线性表的某些类型限制访问数据元素。这些线性表有栈和队列。
栈常用于算术表达式的计算和平衡符号。
队列即可用于调度操作系统任务的系统编程,也可用于模拟研究的编程。
索引群集:散列表、字典(与词典类似)
1.2.3层次群集
非线性群集主要分为两大类:层次群集和组群集。
层次群集:树:大多数操作系统 的文件系统都是采用树型群集设计而成的,其中一个目录作为根,而其他子目录作为根的孩子。
二叉树
堆:总是把最小数据值始终放置在根节点上。在删除时会移除根节点
1.2.4组群集
集合、图、和网络
图:旅行商问题,它要求在履行预算允许的条件下为商人确定最有效的完整旅行路线,使其走遍要去的所有城市
NP-完全问题
1.3 CollectionBase类
CollectionBase类隐含实现了两个为构造Collection类所必须的接口,即ICollection和IEnumberable
1.3.3实现Collection类
class Collection:CollectionBase
{
public void Add(object item)
{
InnerList.Add(item);
}
public void Remove(object item)
{
InnerList.Remove(item);
}
public void Clear()
{
InnerList.Clear();
}
public int Count()
{
return InnerList.Count;
}
}
class chapter1
{
static void Main()
{
Collection names = new Collection();
names.Add("David");
names.Add("Bernica");
names.Add("Reymond");
names.Add("Clayton");
foreach (Object name in names)
{
Console.WriteLine(name);
}
Console.WriteLine("Number of names:" + names.Count());
names.Remove("Reymond");
Console.WriteLine("Number of names:" + names.Count());
names.Clear();
Console.WriteLine("Number of names:" + names.Count());
}
}
1.4泛型编程
代码膨胀的一种解决方案就是使某个值具有多种数据类型,同时又提供此值的一种定义,这种方法称为泛型编程。
泛型编程提供数据类型“占位符”,它在编译时由特定的数据类型填充,这个占位符用一对尖括号(<>)和放在括号间的标识符来表示
class chapter1
{
static void Main()
{
int num1 = 100;
int num2 = 200;
Console.WriteLine("num1:"+num1);
Console.WriteLine("num2:" + num2);
Swap<int>(ref num1, ref num2);
Console.WriteLine("num1:" + num1);
Console.WriteLine("num2:" + num2);
string str1 = "Sam";
string str2 = "Tom";
Console.WriteLine("String 1:" + str1);
Console.WriteLine("String 2:" + str2);
Swap<string>(ref str1, ref str2);
Console.WriteLine("String 1:" + str1);
Console.WriteLine("String 2:" + str2);
}
static void Swap<T>(ref T val1, ref T val2)
{
T temp;
temp = val1;
val1 = val2;
val2 = temp;
}
}
下面的类定义说明了创建泛型类的方法:
Public class Node<T>
{
T data;
Node<T> link;
public Node(T data, Node<T> link)
{
this.data = data;
this.link = link;
}
}
可以按照如下形式使用此类:
Node<string> node1 = new Node<string>("Mike", null);
Node<string> node2 = new Node<string>("Raymond", node1);
System.Collection.Generics命名空间
1.5时间测试
1.5.2用于.net 环境的时间测试
在.net环境中,需要考虑程序运行所处的线程以及无用单元收集可能在任何时候发生的事实。所以在编写时间测试代码时需要考虑这些情况。
值类型存储在栈中,引用类型存储在堆中
当声明变量的子程序完全执行结束时就可以释放掉存储在栈中的变量。另一方面,存储在堆中的变量则会一直保留到调用无用单元收集进程的时候,当没有引用堆数据的行为时。当没有引用堆数据的行为时,只有通过无用单元收集才可以移除这些数据。
在程序执行过程中无用单元收集可能会发生在任何时候。用GC.WaitForPendingFinalizers()解决;
在.net环境中,程序运行在被称为应用程序域的进程中Process类拥有的方法允许操作系统选取当前的进程(程序运行其内的进程),以及选取存储线程开始执行时间的计时器。
TimeSpan startingTime;
startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startingTime);
class chapter1
{
static void Main()
{
int[] nums = new int[100000];
BuildArray(nums);
TimeSpan duration;
DisplayNums(nums);
DisplayNums(nums);
DisplayNums(nums);
duration = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine("Time: " + duration.TotalSeconds);
}
static void BuildArray(int[] arr)
{
for (int i = 0; i <= 99999; i++)
arr[i] = i;
}
static void DisplayNums(int[] arr)
{
for (int i = 0; i <= arr.GetUpperBound(0); i++)
Console.WriteLine(arr[i] + "");
}
}
Timing Test类
Timing 类需要下列数据成员:
startingTime
duration
class Timing
{
TimeSpan duration;
public Timing()
{
duration =new TimeSpan(0);
}
public void stopTime()
{
duration =Process.GetCurrentProcess().TotalProcessorTime;
}
public void startTime()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
public TimeSpan Result()
{
return duration;
}
}
class chapter1
{
static void Main()
{
int[] nums = new int[100000];
BuildArray(nums);
Timing tobj = new Timing();
tobj.startTime();
DisplayNums(nums);
tobj.stopTime();
Console.WriteLine("Time: " + tobj.Result().TotalSeconds);
}
static void BuildArray(int[] arr)
{
for (int i = 0; i <= 99999; i++)
arr[i] = i;
}
static void DisplayNums(int[] arr)
{
for (int i = 0; i <= arr.GetUpperBound(0); i++)
Console.WriteLine(arr[i] + "");
}
}