数据结构算法与应用语言描述
❶ 数据结构与算法分析 —— C 语言描述:开放寻址法
分离链接散列算法的缺点是需要指针,由于给新单元分配地址需要时间,因此这就导致算法的速度多少有些缓慢,同时算法实际上还要求实现另一种数据结构。除使用链表解决冲突外,开放寻址散列法(open addressing hashing)是另外一种用链表解决冲突的方法。在开放寻址散列算法系统中,如果有冲突发生,那么就要尝试选择另外的单元,直到找出空的单元为止。更一般地,单元 相继试选,其中 ,且 。函数 F 是冲突解决方法,因为所有的数据都要置入表内,所以开放寻址散列法所需要的表要比分离链接散列用的表大。一般说来,对开放寻址散列算法来说,装填因子应该低于 。开放寻址散列法有三种常用的冲突解决办法:
在线性探测法中,函数 F 是 的线性函数,典型的情形是 。这相当于逐个探测每个单元(必要时可以绕回)以查找出一个空空单元。即插入一个第一个冲突关键字,它将被放入下一个空闲地址,即地址 0,该地址是开放的。之后插入的冲突关键字,会对表进行试选,只要表足够大,总能够找到一个自由单元,但是如此花费的时间是相当多的。更糟的是,即使表相对较空,这样占据的单元也会开始形成一些区块,其结果称为一次聚集(primary clustering),于是,散列到区块中的任何关键字都需要多次试选单元才能解决冲突,然后该关键字被添加到相应的区块中。
可以证明,使用线性探测的预期探测次数对于插入和不成功的查找来说大约为 ,而对于成功的查找来说则是 。略加思考不难得出,成功查找应该比不成功查找平均花费较少的时间。
如果聚算不算是问题,那么对应的公式就不难得到。我们假设有一个很大的表,并设每次探测都与前面的探测无关。对于随机冲突解决办法而言,这些假设是成立的,并且当 不是非常接近 1 时也是合理的。首先,我们导出在一次不成功查找中探测的期望次数,而这正是直到我们找到一个空单元的探测次数。由于空单元所占的份额为 ,因此我们预计要探测的单元数是 。一次成功查找的探测次数等于该特定元素插入时所需要的探测次数。当一个元素被插入时,可以看成是一次不成功查找的结果。因此,我们可以使用一次不成功查找的开销来计算一次成功查找的平均开销。
需要指出, 在 0 到当前值之间的变化,因此早期的插入操作开销较少,从而降低平均开销。我可以通过使用积分计算插入时间平均值的方法来估计平均值,如此得到
这些公式显然优于线性探测相应的公式,聚集不仅是理论上的问题,而且实际上也发生在具体的实现中。线性探测的预计探测次数与 呈正比,即 越小,插入操作平均次数越少。
平方探测是消除线性探测中一次聚集问题的冲突解决办法。平方探测就是冲突函数为二次函数的探测方法。流行的选择是 。
对于线性探测,让元素几乎填满散列表并不是个好主意,因为此时表的性能会降低。对于平方探测情况甚至更糟:一旦表被填满超过一半,当表的大小不是素数时甚至在表被填满超过一半之前,就不能保证一次找到一个空单元了。这是因为最多有一半的表可以用作解决冲突的备选位置。
定理:如果使用平方探测,且表的大小是素数,那么当表至少有一半是空的时候,总能够插入一个新的元素。
哪怕表有比一半多一个的位置被填满,那么插入都有可能失败(虽然这是非常难以见到的,但是把它记住很重要。)。另外,表的大小是素数也非常重要,如果表的大小不是素数,则备选单元的个数可能会锐减。
在开放寻址散列表中,标准的删除操作不能施行,因为相应的单元可能已经引起过冲突,元素绕过它存在了别处。例如,如果我们删除一个冲突的中间元素,那么实际上所有其他的 Find 例程都将不能正确运行。因此,开放寻址散列表需要懒惰删除,虽然在这种情况下并不存在真正意义上的懒惰。
开放寻址散列表的类型声明如下,这里,我们不用链表数组,而是使用散列表项单元的数组,与在分离链接散列中一样,这些单元也是动态分配地址的。
初始化开放寻址散列表的例程如下,由分配空间(第1~10行)及其后将每个单元的 Info 域设置为 Empty 组成。
使用平方探测散列法的 Find 例程如下。如果分裂链接散列法一样, 将返回 Key 在散列表中的位置。如果 Key 不出现,那么 Find 将返回最后的单元。该单元就是当需要时,Key 将被插入的地方。此外,因为被标记了 Empty,所以表达 Find 失败很容易。为了方便起见,我们假设散列表的大小至少为表中元素个数的两倍,因此平方探测方法总能够实现。否则,我们就要在第 4 行前测试 。在下面的例程中,标记为删除的那些元素被认为还在表内,这可能引起一些问题,因为该表可能提前过满。
第 4~6 行为进行平方探测的快速方法。由平方解决函数的定义可知, ,因此,下一个要探测的单元可以用乘以 2(实际上就是进行一位二进制移位)并减 1 来确定。如果新的定位越过数组,那么可以通过减去 TableSize 把它拉回到数组范围内。这比通常的方法要快,因为它避免了看似需要的乘法和除法。注意一条重要的警告:第 3 行的测试顺序很重要,切勿改变它。
下面的例程是插入。正如分离链接散列方法那样,若 Key 已经存在,则我们就什么也不做。其他工作只是简单的修改。否则,我们就把要插入的元素放在 Find 例程指出的地方。
虽然平方探测排除了一次聚集,但是散列到同一位置上的那些元素将探测相同的备选单元。这叫做二次聚集(secondary clustering)。二次聚集是理论上的一个小缺憾,模拟结果指出,对每次查找,它一般要引起另外的少于一半的探测。
双散列(double hashing)能够解决平方探测中的二次聚集问题,不过也需要花费另外的一些乘法和除法形销。对于双散列,一种流行的选择是 。这个公式是说,我们将第二个散列函数应用到 X 并在距离 , 等处探测。 选择的不好将会是灾难性的。
在双散列时,保证表的带下为素数是非常重要的。假设我们在插入一个关键字的时候,发现它已经引发冲突,就会选择备选位置,如果表的大小不是素数,那么备选单元就很有可能提前用完。然后,如果双散列正确实现,则模拟表明,预期的探测次数几乎和随机冲突解决方法的情形相同。这使得双散列理论上很有吸引力,不过,平方探测不需要使用第二个散列函数,从而在实践中可能更简单并且更快。
❷ 数据结构与算法分析 —— C 语言描述:二叉树
二叉树(binary tree)是一棵树,其中每个节点的儿子都不能多于两个。
二叉树的一个性质是平均二叉树的深度要比 N 小的多,这个性质有时很重要。分析表明,这个平均深度为 ,而对于特殊类型的二叉树,即二叉查找树(binary search tree)。其深度的平均值是 。不幸的是,在最坏情况下,这个深度可以大到 N-1 的。
因为一棵二叉树最多有两个儿子,所以我们可以用指针直接指向它们。树节点的声明在结构上类似于双链表的声明,在声明中,一个节点就是由 key(关键字)信息加上两个指向其他节点的指针(Left 和 Right)组成的结构。
应用于链表上的许多法则也可以应用到树上。特别地,当进行一次插入时,必须调用 malloc 创建一个节点。节点可以在调用 free 删除后释放。
我们可以用在画链表时常用的矩形框画出二叉树,但是,树一般画成圆圈并用一些直线连接起来,因为二叉树实际上就是图(graph)。当涉及树时,我们也不显示地画出 NULL 指针,因为具有 N 个节点的每一棵二叉树都将需要 N+1 个 NULL 指针。
二叉树有许多与搜索无关的重要应用。二叉树的主要用处之一是在编译器的设计领域。
上图就是一个表达式树(expression tree)。表达式树的树叶是操作树(operand),比如常数或者变量,而其他的节点为操作符(operator)。由于这里所有的操作都是二元的,因此这棵特定的树正好是二叉树,虽然这是最简单的情况,但是节点含有的儿子还是有可能多于两个的。一个节点也有可能只有一个儿子,如果有一目减算符(unary minus operator)的情形。可以将通过递归计算左子树和右子树所得到的值应用在根处的算符操作中而算出表达式树 T 的值。上面里的例子中,左子树的值是“((3+1) 3)/((9-5)+2)”,右子树的值是“(3 (7-4)+6)”,因此整棵树的表达式就是图上的结果。
我们可以通过递归产生一个带括号的左表达式,然后打印出在根处的运算符,最后再递归地产生一个带括号的右表达式而得到一个(对两个括号整体进行计算的)中缀表达式(infix expression)。这种一般的方法(左,节点,右)称为中序遍历(inorder traversal);由于其产生的表达式类型,这种遍历很容易记忆。
另一个遍历策略是递归打印出左子树、右子树,然后打印运算符。如果我们应用这种策略于上面的树,则输出将是“31+3 95-2+/743- 6+-”。这种遍历策略一般称为后序遍历(postorder traversal)。
第三种遍历策略是先打印出运算法,然后递归地打印出右子树和左子树。同样的,应用这种策略于上面的树,则输出将是“-/ ++313-952+ 3-746”,这是一种不太常用前缀(prefix)记法,这种遍历策略为先序遍历(preorder traversal)。
这里我们只给出一种算法,来把后缀表达式转变成表达式树。这里的要点是,一次一个符号地读入表达式。如果符号是操作符,那么我们就建立一个单节点树并将一个指向它的指针推入栈中。如果符号是操作符,那么我们就从栈中弹出指向两棵树 和 的那两个指针( 的先弹出)并形成一棵新的树,该树的根就是操作符,它的左、右儿子分别指向 和 。然后将这棵新树的指针压入栈中。
❸ 数据结构算法与应用c++语言描述 答案
a4x
4 + a3x
3 + a2x
2 + a1x + a0 ≡ 0 (mod p2
)
❹ 数据结构与算法分析 —— C 语言描述:树的遍历及应用
树有很多应用,流行的用法之一是包括 UNIX、VAX/VMS 和 DOS 在内的许多常用操作系统中的目录结构。
假设我们有一个根目录 A,A 目录下有一个目录 B,B 目录下有一个目录 C,C 目录下有一个文件 D。此时,文件 D 的全路径名就为 A/B/C/D,其中,每一个 “/” 后的每一个 “/”在树中都表示一山配山条边,这个分级文件系统非常流行,因为它能够使得用户逻辑地组织数据。不仅如此,在不同目录下的两个文件还可以享有相同的名字,因为他们必然有从根开始的不同的路径从而具有不同的路径名。在 UNIX 文件系统中的目录就是含有它的所有儿子的一个文件。(在 UNIX 文件系统中的每个目录还有一项指向该目录本身以及另一项指向该目录的父目录。因此,严格说来,UNIX 文件系统不是树,而是类树(treelike)。)
假设我们想要列出目录中所文件中所有文件的名字。我们的输出格式将是:深度为 的文件的名字被 次跳格(tab) 锁进后打印出来。
算法的核心为递归程序 ListDir。为了显示根时不进行锁进,该例程需要从目录名和深度 0 开始。这里的深度是一个内部薄记变量,而不是主调例程能够期望知道的那种参数。因此,驱动例程 ListDirectory 用于将递归例程和外界连接卖塌起来。
算法的逻辑简单易懂。ListDir 的参数是到树中的某种引用。只要引用合理,则引用涉及的名字在进行适当次数的跳格锁进后被打印出来。如果是一个目录,那么我们递归地一个逗中一个地处理它所有的儿子。这些儿子出在一个深度上,因此需要锁进一段附加的空格。
这种遍历的策略叫做先序遍历(preorder traversal)。在先序遍历中,对节点的处理工作是在它的诸儿子节点被处理之前进行的。当程序运行时,每个父节点恰好最多只执行一次,因为每个名字只输出一次。不仅如此,对于每个节点的每一个儿子节点最多只能执行一次。在遍历过程中,每个 for 循环终止在 NULL 指针上,但每个节点最多有一个这样的指针。因此,每个节点总的工作量是常数。如果有 N 个文件名需要输出,则运行时间就是 O(N)。
另一种遍历树的方法是后序遍历(postorder traversal)。在后序遍历中,在一个节点处的工作是在它的诸儿子节点被计算后进行的。
由于目录本身也是文件,因此它们也有大小。设我们想要计算被该树所有文件占用的磁盘区块的总数。最自然的做法是找出含有子目录中的块的个数。于是,磁盘块的总数就是子目录中的块的总数加上该目录使用的一个块。
如果不是一个目录,那么 SizeDirectory 只返回所占用的块数。否则,将被占用的块数与其所有子节点(递归地)发现的块数相加。
❺ 数据结构,算法与应用 ---C++语言描述(代码与习题答案)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int status;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
int *elem;
int length;
int listsize;
}sqlist;
int flag=0;
status initlist(sqlist *l)
{
l->elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l->elem)exit(OVERFLOW);
l->length=0;
l->listsize=LIST_INIT_SIZE;
return OK;
}
status listinsert(sqlist *l,int i,int e)
{
int *newbase,*q,*p;
if(i<1||i>l->length+1)return ERROR;
if(l->length>=l->listsize)
{
newbase=(int*)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
if(newbase)exit(OVERFLOW);
l->elem=newbase;
l->listsize+=LISTINCREMENT;
}
q=&(l->elem[i-1]);
for(p=&(l->elem[l->length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++l->length;
return OK;
}
void listprint(sqlist *l)
{
int i;
for(i=0;i<l->length;i++)
{
printf("%-5d",l->elem[i]);
}
}
status listdelete(sqlist *l,int i,int *e)
{
int *p,*q;
if((i<1)||(i>l->length))return ERROR;
p=&(l->elem[i-1]);
e=*p;
q=l->elem+l->length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--l->length;
return OK;
}
status getelem(sqlist *l,int i,int *e)
{
if((i<1)||(i>l->length))return ERROR;
*e=l->elem[i-1];
return OK;
}
int meun()
{
int a;
printf("*************************\n");
printf("* 1 InitList *\n");
printf("* 2 ListInsert *\n");
printf("* 3 ListPrint *\n");
printf("* 4 Delete *\n");
printf("* 5 Getelem *\n");
printf("* 6 Exit *\n");
printf("*************************\n");
fflush(stdin);
do
{
printf("qing xuan ze:\n");
scanf("%d",&a);
}while(!(a>=1&&a<=6));
return a;
}
void main()
{
sqlist l,*p;
int x,i,e,result;
p=&l;
do
{ clrscr();
x=meun();
switch(x)
{
case 1: initlist(p);
flag=1;
printf("initlist succes!press enter contiue");
getch();
break;
case 2: if(flag==0)
{
printf("you must initlist first!please select!");
getch();
break;
}
fflush(stdin);
printf("\n please input i and e:");
scanf("%d%d",&i,&e);
result=listinsert(p,i,e);
if(result==ERROR)
printf("error:i out of rang!press enter continue");
else
printf("insert completed!please enter continue");
getch();
break;
case 3: printf("sqlist:\n");
listprint(p);
getch();
break;
case 4: printf("\n please input i:");
scanf("%d",&i);
result=listdelete(p,i,&e);
if(result==ERROR)
printf("error:i out of rang!press enter continue");
else
printf("delete completed!please enter continue");
getch();
break;
case 5: printf("\n please input i:\n");
scanf("%d,&i");
result=getelem(p,i,&e);
if(result==ERROR)
printf("error:i out of rang!press enter continue");
else
printf("completed:%d",e);
getch();
break;
case 6: printf("bye\n");
getch();
exit(0);
}
}while(1);
}
❻ 数据结构与算法c++语言描述 怎么样
本书含橘是关于计算机科学与工程领域的基础性研究科目之一——数据结构与算法的专着。 本书在简乱老郑要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列哗颂、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之算法、分枝定界算法等多种算法设计方法,为数据结构与算法的继续学习和研究奠定了一个坚实的基础。
更为可贵的是,本书不仅仅介绍了理论知识,还提供了50多个应用实例及600多道练习题。 本书内容广博权威,结构清晰合理,是一本全新的有关数据结构与算法的教材,对于计算机科学与工程领域的从业人员也是一本很好的参考书。
❼ c++语言编程题两题,希望高手帮解答一下,谢谢!
第一题缓粗:
#include<iostream>
#include<cstring>
usingnamespacestd;
classString
{
friendostream&operator<<(ostream&output,String&a);
friendintmain();
private:
intsize;
char*str;
public:
String(char*a);
};
String::String(char*a)
{
str=a;
size=strlen(a);
}
ostream&operator<<(ostream&output,String&a)
{
丛燃inti;
intn=a.size;
for(i=0;i<n;i++){
output<<a.str[i];
}
returnoutput;
}
intmain()
{
char*a="Helloworld!";
cout<<a<<endl;
Strings=String(a);
cout<<s;
cin.get();
return0;
}
❽ 数据结构与算法分析:C语言描述的目录
第1章 引论1.1 本书讨论的内容1.2 数学知识复习1.2.1 指数1.2.2 对数1.2.3 级数1.2.4 模运算1. 2.5 证明方法1.3 递归简论总结练习参考文献第2章 算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的解.2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性总结练习参考文献第3章 表、栈和队列3.1 抽象数据类型(adt)3.2 表adt3.2.1 表的简单数组实现3.2.2 链表3.2.3 程序设计细节3.2.4 常见的错误3.2.5 双链表3.2.6 循环链表3.2.7 例子3.2.8 链表的游标实现3.3 栈adt3.3.1 栈模型3.3.2 栈的实现3.3.3 应用3.4 队列adt3.4.1 队列模型3.4.2 队列的数组实现3.4.3 队列的应用总结练习第4章 树4.1 预备知识4.1.1 树的实现4.1.2 树的遍历及应用4.2 二叉树4.2.1 实现4.2.2 表达式树4.3 查找树adt--二叉查找树4.3.1 makeempty4.3.2 find4.3.3 findmin和findmax4.3.4 insert4.3.5 delere4.3.6 平均情形分析4.4 avl树4.4.1 单旋转4.4.2 双旋转4.5 伸展树4.5.1 一个简单的想法4.5.2 展开4.6 树的遍历4.7 b-树总结练习参考文献第5章 散列5.1 一般想法5.2 散列函数5.3 分离链接法5.4 开放寻址法5.4.1 线性探测法5.4.2 平方探测法5.4.3 双散列5.5 再散列5.6 可扩散列总结练习参考文献第6章 优先队列(堆)6.1 模型6.2 一些简单的实现6.3 二叉堆6.3.1 结构性质6.3.2 堆序性质6.3.3 基本的堆操作6.3.4 其他的堆操作6.4 优先队列的应用6.4.1 选择问题6.4.2 事件模拟6.5 d-堆6.6 左式堆6.6.1 左式堆的性质6.6.2 左式堆的操作6.7 斜堆6.8 二项队列6.8.1 二项队列结构6.8.2 二项队列操作6.8.3 二项队列的实现总结练习参考文献第7章 排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7. 4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程7.7.5 快速排序的分析7.7.6 选择的线性期望时间算法7.8 大型结构的排序7.9 排序的一般下界7.9.1 决策树7.10 桶式排序7.11 外部排序7.11.1 为什么需要新的算法7.11.2 外部排序模型7.11.3 简单算法7.11.4 多路合并7.11.5 多相合并7.11.6 替换选择总结练习参考文献第8章 不相交集adt8.1 等价关系8.2 动态等价性问题8.3 基本数据结构8.4 灵巧求并算法8.5 路径压缩8.6 按秩求并和路径压缩的最坏情形8.6.1 union/find算法分析8.7 一个应用总结练习参考文献第9章 图论算法9.1 若干定义9.1.1 图的表示9.2 拓扑排序9.3 最短路径算法9.3.1 无权最短路径9.3.2 dijkstra算法9.3.3 具有负边值的图9.3.4 无圈图9.3.5 所有点对最短路径9.4 网络流问题9.4.1 一个简单的最大流算法9.5 最小生成树9.5.1 prim算法9.5.2 kruskal算法9.6 深度优先搜索的应用9.6.1 无向图9.6.2 双连通性9.6.3 欧拉回路9.6.4 有向图9.6.5 查找强分支9.7 np-完全性介绍9.7.1 难与易9.7.2 np类9.7.3 np-完全问题总结练习参考文献第10章 算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 huffman编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些运算问题的理论改进10.3 动态规划10.3.1 用一个表代替递归10.3.2 矩阵乘法的顺序安排10.3.3 最优二叉查找树10.3.4 所有点对最短路径10.4 随机化算法10.4.1 随机数发生器10.4.2 跳跃表10.4.3 素性测试10.5 回溯算法10.5.1 收费公路重建问题10.5.2 博弈总结练习参考文献第11章 摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11. 5 伸展树总结练习参考文献第12章 高级数据结构及其实现12.1 自顶向下伸展树12.2 红黑树12.2.1 自底向上插入12.2.2 自顶向下红黑树12.2.3 自顶向下删除12.3 确定性跳跃表12.4 aa-树12.5 treap树12.6 k-d树12.7 配对堆总结练习参考文献索引
❾ 《数据结构与算法分析C语言描述》真的适合初学者吗
数据结构课程一般都是在大学大一第二学期进行开设,从基础上来说至少需要两项
计算机基础知识(学会正常使用电脑)
一门计算机语言(这本书是C语言的,所以应该学会C语言)
整体来说是适合初学者学习的,但是这个初学者的空间想象能力和逻辑思维能力不能太弱。因此最好要有一定的数学基础,例如有一定的高数和线性数学基础,能够理解一般的图形,矩阵,阶乘等数学概念。
❿ 关于计算机网络方面的书籍
1. 计算机网络常识书籍
计算机网络常识书籍 1.计算机网络入门需要看那些书籍
1)编码:隐匿在计算机软硬件背后的语言,此书从信息的编码,数字的不同进制表示,到计算机采用的二进制机器级表示开始,到用电路构建一个简单的加法器,触发器,计数器,存储器,甚至一个具有控制器,运算器,存储器的简易CPU,娓娓道来,真是醍醐灌顶。最后还谈到了图形界面的原理。此书作者更是被传为圣经的《Windows程序设计》的作者Charles Petzold。读完此书可对计算机硬件的原理与设计有一全面深入之认识,犹如身处群山之巅,一览无余。
2)深入理解计算机系统 上一本《编码》通俗易懂,即使没有计算机相关知识也能懂,但缺乏一些计算机机制的介绍。此书是国外着名的介绍计算机系统方面的书,从程序员的角度带你畅游计算机系统架构。涉及程序的机器级表示(机器码,汇编),处理器体系结构,存储器结构,系统IO,网络编程,并发编程,以及程序性能的优化。读完此书可对计算机系统,程序设计有一深层次了解。
3)就C语言而言,K&R的 C程序设计语言 的无疑是最好的参考书,不过对初学者来说还是有一定难度,辅以诸如 C和指针 ,C陷阱与缺陷 会有更好的效果。当然多写程序才是王道,多写才能发现问题,加深认识。
4)Debug Hacks 此书介绍GDB调试工具及调试技巧,本人现在主要就是使用gcc gdb啦。此书助你更好的找出臭虫。
6)数据结构与算法分析 介绍算法和数据结构的书籍很多,但本人就是用这本书学习的,所以推荐。此书的前3章和第7章就介绍了题主要求的一些数据结构和算法,后面几张介绍树,排序,图论算法,及一些高级数据结构。读完此书将助你设计更优美的程序。
2.计算机网络经典书籍
《tcpip详解》分三卷,国外经典计算机教材,有中文译版,不过不适合你的。
《计算机网络》也分很多种,如果你要考网工的话或者你想学习网络推荐你看以下的书籍:
网络工程教程(第二版) 雷震甲 主遍 清华大学出版 (这本太深了,不过内容全)网工指定教材
网络工程必读系列 王达 这套书我看了两遍,实在不错。。。
计算机网络第五版 谢希仁 主遍 谢希仁同时还出了很多书都关于TCP/IP的书籍,具体书名我忘记,我觉得他讲解得思路清晰,易理解,适合基础旅岩差的。
计算档散机网络第四版,这是国外经典计算机网络经典教程,作者都是英文名字(具体我忘记了) ,我以前我学时很喜欢看这本。
3.计算机网络方面有哪些书籍值得推荐
计算机网络第五版,谢希仁的,个人感觉是国内最好的初级书籍。
如果想对网络有个清晰、全面的认识,可以阅读下面三本书籍: 第一本就是潘爱民翻译的Andrew S.Tanenbaum的《计算机网络》,此书讲明白了网络之道,即计算机网络通信的主要原理; 第二本是W.Richard Stevens的《TCP/IP详解卷一:协议》,此书讲明白了网络之术,即TCP/IP协行镇氏议簇的工作过程; 第三本是Douglas E.er的《计算机网络与因特网》,此书尝试在更广泛意义上解答“计算机网络和因特网是如何工作的”这一基本问题,解释了协议是如何使用硬件和应用是如何使用协议来满足用户的需求。
4.有关计算机编程,网络基础知识的书籍
建议你从C语言开始学,学好了它以后学其他语言会很容易上手
推荐你先看谭浩强的《C语言程序设计》先,这是一部非常好的C语言书籍,慢慢来学习程序设计是一个非常漫长的过程,不要着急,一本书多看两遍三遍,学会交叉学习法,在学习C的过程中,可以看看数据结构,编译原理,操作系统等书籍,对编成都是很有帮助的。最开始学习的时候,先不要编一些比较大的程序,多编一些小程序,比如数组运算,字符组合等等,指针是C语言的精华,是比较复杂的部分。如果指针这部分都可以熟练的应用,那么C语言里你还有什么不明白的吗,我相信你,你一定能学习好C语言的。
可以按照C——C++——JAVA的顺序学习,C++的学习是很有难度的,类,标准库,多态,继承等等比较抽象难道懂的概念,虽然他秉承了C语言的风格,但是有很多很多是C语言不具备的,要多看书,上机实践也是必不可少的。《C++编程思想》,《C++标准库》,这些书都非常好,内容也很全面,例程书籍也是必不可少的,多看源代码对编程是很有帮助的,也会少走很多弯路。总之,C++的学习是一个比较漫长的过程,大概需要两年的时间,这只是底限,如果想学通,学精,还需要更多的时间。
我向你推荐一些C++经典书籍:
c++程序设计教程
c++编程思想
c++大学教程
c++程序设计语言
数据结构算法与应用c++语言描述
c++标准模板库------自修教程与参考手册
泛型编程与STL
深度探索c++对象模型
设计模式---可复用面向对象软件的基础
重构---改善既有代码的设计
Essential c++
Effective c++
More Effctive c++
C++ primer
前五本应该属于入门书籍,后面的属于学习难度比较大的,想提高C++的编程能力,看看这些书籍有好处。建议你把编程思想这本书多看看。多做练习题,对提高编程水平的帮助是很大的。
其实语言是相通的,一门语言学会了,学习其他语言就比较容易了。
业界有这样一种说法,因为JAVA这门语言包含了C++的一些特性,掌握了C++,就等于掌握了JAVA的80%,
在掌握了C++之后(我说的掌握指的是,可以熟练用C++编程序了,并没有要求你完全掌握C++的所有部分,没有人能达到这一点,因为C++太庞大了,如果能坚持不懈的学习C++两年到三年的时间了,你就可以学习其他的语言了)可以试着学习一些其他的语言,如JAVA,VC++等等比较复杂的语言.
这时候可以说你已经对程序设计语言有个大体的认识了,可以明确自己学习的方向,根据自己的学习情况而定,是学习一些自己比较感兴趣的语言啊(从兴趣出发),还是为了找工作啊,开始进行更深入的学习.比如学习windows下的框架编程和编程等等比较复杂的语言.
如果是为了找工作的话你一定学好C,C++,JAVA三门语言.
在我国目前的软件开发行业中,C,C++,JAVA的需求量是非常大的.
好了,说了这么多,可以参考一下,为自己做个学习计划,要对自己有信心,最后祝你在学习编程的道路上走的更好更远,祝你学有所成!!
5.计算机网络技术的推荐书籍
如果想对网络有个清晰、全面的认识,可以阅读三本书籍:
第一本就是潘爱民翻译的Andrew S.Tanenbaum的《计算机网络》,此书讲明白了网络之道,即计算机网络通信的主要原理;
第二本是W.Richard Stevens的《TCP/IP详解卷一:协议》,此书讲明白了网络之术,即TCP/IP协议簇的工作过程;
第三本是Douglas E.er的《计算机网络与因特网》,此书尝试在更广泛意义上解答“计算机网络和因特网是如何工作的”这一基本问题,解释了协议是如何使用硬件和应用是如何使用协议来满足用户的需求。
6.推荐计算机基础知识学习的书籍
1、《计算机基础(第二版)》——姜岩、王秀玲
本书介绍了信息与计算机的基础知识、Windows XP操作系统的基本操作和基本使用知识、Word
2003文字处理软件的基本知识、Excel 2003电子表格处理软件的基本知识和PowerPoint 2003文档
演示软件等知识做了简单的介绍。
2、《计算机应用基础》 ——刘锡轩、丁恒、侯晓音
本书是为非计算机专业类学生提供计算机一般应用所必需的基础知识、能力和素质的课程。本书满
足普通高等院校培养“应用型人才”的教学宗旨,内容丰富,与时俱进,实用性强。
3、《计算机应用基础》——杨飞宇,孙海波
本书主要介绍了计算机组装与维护、计算机网络技术、电子文档制作、电子报表制作和演示文稿制
作。
4、《计算机应用基础》——张 明、王 翠、张和伟
本书采用任务驱动的方式进行编写,内容强调操作性和实用性。全书涵盖计算机基础知识、
Windows XP操作系统、Word 2003文字处理软件、Excel 2003电子表格处理软件和PowerPoint
2003演示文稿制作软件等内容。
5、《深入理解计算机系统》————布赖恩特
本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚
拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更
好地理解程序执行的方式,改进程序的执行效率。
6、《计算机应用基础》——武马群
本书主要介绍了计算机基础知识、操作系统Windows XP、因特网(Inter)应用、文字处理软件
Word 2003应用、电子表格处理软件Excel 2003应用、多媒体软件应用、演示文稿软PowerPoint
2003应用等内容。