08 2015 档案

摘要:问题:用1,2,3,...,9组成3个三位数abc,def,和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。提示:不必太动脑筋。 // 习题2-10 样例(permutation) #include int main(void) { int x, y, z, a[10] = {0}; for(x = 100; x <... 阅读全文
posted @ 2015-08-20 16:58 programnote 阅读(198) 评论(0) 推荐(0) 编辑
摘要:Question: Let us suppose we have an array whose ith element gives the price of a share on the day i.If you were only permitted to buy one share of the stock and sell one share of the stock, design an... 阅读全文
posted @ 2015-08-16 09:33 programnote 阅读(330) 评论(0) 推荐(0) 编辑
摘要:小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查)。拼写检查本身也是一个词典,只不过容量比较小。现实生活中有许多词典的应用:拼写检查数据库管理应用中的数据词典装载机,汇编器,便一起产生的符号表网络公司的路由表(DNS域名解析)在计算机科学中,提到抽象... 阅读全文
posted @ 2015-08-14 11:22 programnote 阅读(6726) 评论(1) 推荐(1) 编辑
摘要:符号表的实现有很多方式,下面介绍其中的几种。 乱序(未排序)数组实现 这种情况,不需要改变数组,操作就在这个数组上执行。在最坏的情况下插入,搜索,删除时间复杂度为O(n)。 有序(已排序)数组实现 这种情况我们就有了排序好的关键字和相应的值。 通过关键字在数组中存储 keys[i]为第i位大的key(关键字) values[i]就是第i位大key对应的值 由于元素是按顺序存储在数组中的,找某个... 阅读全文
posted @ 2015-08-14 11:20 programnote 阅读(1348) 评论(0) 推荐(0) 编辑
摘要:枚举给用户定义固定数据组提供了方便。枚举类就是一系列常量整型值,这也就意味着枚举类型不能被修改。 这里我们将要讨论C语言中枚举类型的用法和限制。 枚举通过枚举关键值定义,类似结构体定义 语法(Syntax): enum tagname{CONST1=1,CONST2,…} enumVariable; tagname,枚举类型名,这一项可以省略。 {CONST1=1,CONST2,…}一组代替常量... 阅读全文
posted @ 2015-08-13 16:54 programnote 阅读(416) 评论(0) 推荐(0) 编辑
摘要:Question: What is a Pointer? What are its limitations? What are its benefits? How do we use it? What all operation we can perform using it? In this article we are going to discover answers to all the... 阅读全文
posted @ 2015-08-13 16:13 programnote 阅读(315) 评论(0) 推荐(0) 编辑
摘要:属于空间复杂度(Space Complexity)在很多情况下被错认为是附属空间(Auxiliary Space),下面是附属空间和空间复杂度的定义。 附属空间(Auxiliary Space)是算法使用的额外空间(extra space)或临时空间(temporary space)。 空间复杂度(Space Complexity)指的是算法使用的总空间包括输入使用的空间。 空间复杂度包含附属空间... 阅读全文
posted @ 2015-08-13 14:52 programnote 阅读(1139) 评论(0) 推荐(0) 编辑
摘要:如果具有同样关键字的纪录的在排序前和排序后相对位置保持不变。一些算法本身就是稳定的,如插入排序,归并排序,冒泡排序等,不稳定的算法有堆排序,快速排序等。然而,一个本身不稳定的算法通过一点修正也能变成稳定的算法。有一些特定的方式可以做到,一般来说,任何排序算法中的比较本质上都是不稳定的,通过修改关键的... 阅读全文
posted @ 2015-08-13 14:34 programnote 阅读(421) 评论(0) 推荐(0) 编辑
摘要:选择排序就是在选择数组元素上做文章,关键是如何选择?选择的标准是什么?选择之后放在哪?所有这些都是选择排序的问题。 选择排序算法中,通常会有以下操作: 从数组第一个元素开始。 遍历整个数组,找到最小的元素。 将最小的元素与数组第一个元素交换。 从第二个元素开始重复上述步骤。 看一个例子: 可以看到,一开始的数组是乱序的,红色的方块代表排好序的元素,蓝色的代表未排序的元素。 从元素7开始,扫... 阅读全文
posted @ 2015-08-12 16:04 programnote 阅读(657) 评论(0) 推荐(0) 编辑
摘要:快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家。 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot)。 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素... 阅读全文
posted @ 2015-08-12 15:05 programnote 阅读(309) 评论(0) 推荐(0) 编辑
摘要:归并排序是颇受欢迎的排序算法,因为他的时间复杂度恒为O(n log(n))。顾名思义,这个排序算法就是将多个排好序的数组合并成单个排好序的数组。 具体步骤如下: 将待排序的数组分成左右两部分。 再将这两部分分别分成左右两部分。 一直分下去,直到不可分(每部分只有一个元素)。 由于数组被分成许多的单个数据,比较起来就简单了,然后开始合并,合并的同时排序。 持续合并直到得到排好序的数组。 下... 阅读全文
posted @ 2015-08-12 10:54 programnote 阅读(438) 评论(0) 推荐(0) 编辑
摘要:Question: We have 2 sorted arrays and we want to combine them into a single sorted array. Input: arr1[] = 1, 4, 6, 8, 13, 25 || arr2[] = 2, 7, 10, 11, 19, 50Output: 1, 2, 4, 6, 7, 8, 10, 11, 1... 阅读全文
posted @ 2015-08-12 10:35 programnote 阅读(280) 评论(0) 推荐(0) 编辑
摘要:这是排序算法中最常见的排序方法,也是初学者使用最多的。有时候我们在生活中也会不自觉地用到插入排序,例如: 给手里的牌排序 这是最常见的例子之一,我们通常从纸牌的一边开始看,找到一张位置不正确的,把它拿出来,再从开始的位置开始找,直到找到合适者张牌插入的位置。 假设手里有这几张牌2,4,6,3,10,K,J。排序的步骤如下: 假设我们从左边开始看,2位置正确,4位置正确,6位置正确,3错误,... 阅读全文
posted @ 2015-08-12 10:01 programnote 阅读(333) 评论(0) 推荐(0) 编辑
摘要:未被初始化的变量称为野指针(wild pointer)。顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题。 理解下面的例子: int main() { int *p; // wild pointer, some unknown memory location is pointed *p = 12; // Some unknown memory... 阅读全文
posted @ 2015-08-11 15:49 programnote 阅读(833) 评论(0) 推荐(0) 编辑
摘要:程序中的内存泄漏是怎么回事呢? 我们写过很多带有关键词free()的程序。比如我在这篇博文关于链表的一些重要操作(Important operations on a Linked List)中删除整个链表用到这个函数,代码片断如下: struct node * deleteList(struct node * head) { struct node * temp; while(h... 阅读全文
posted @ 2015-08-11 15:28 programnote 阅读(387) 评论(0) 推荐(0) 编辑
摘要:上篇博文中讨论了链表的一些基本操作:链表的基本操作(Basic Operations on a Linked List)然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作。在表头插入元素。在表中插入元素。在确定的位置插入。在某个元素的后面插入。从链表中删除一个元素。删除整个链表... 阅读全文
posted @ 2015-08-11 14:58 programnote 阅读(408) 评论(0) 推荐(0) 编辑
摘要:链表可以进行如下操作:创建新链表增加新元素遍历链表打印链表下面定义了对应以上操作的基本函数。创建新链表新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表。由于这个链表只有一个节点,它所指向的下一个节点为NULL。/*Defining a function to crea... 阅读全文
posted @ 2015-08-11 14:19 programnote 阅读(519) 评论(0) 推荐(0) 编辑
摘要:C语言中有三种类型的循环:for,while,do-while。 while循环先判断循环条件。 while (condition) { //gets executed after condition is checked } do-while循环先执行循环体重的语句,再判断循环条件。 do { //gets executed at least once } while (con... 阅读全文
posted @ 2015-08-11 13:48 programnote 阅读(754) 评论(0) 推荐(0) 编辑
摘要:什么是搜索? 在计算机科学中,搜索就是在一个事物的集合中找到具有特定特征的一项的过程。这些集合中的元素可能是排好序的数据库中的记录,简单数组中的数据,文件中的文本,树中的节点,几何图形中的点和边或者是其他搜索空间的元素。 搜索有什么作用? 搜索是计算机科学的核心算法之一。我们都知道现代的计算机存储了很多数据和信息,为了快速的获取我们所要的信息我们就需要高效的搜索算法。有一些数据组织方法可以加快搜索... 阅读全文
posted @ 2015-08-10 21:44 programnote 阅读(357) 评论(0) 推荐(0) 编辑
摘要:当我们在字典中查找某个单的时候,一般我们会翻到一个大致的位置(假设吧,翻到中间位置),开始查找。如果翻到的正好有我们要的词,那运气好,查找结束。如果我们要找的词还在这个位置的前面,那我们对前面的这一半词典继续搜索,翻到某个位置(假设是四分之一的位置)等等。这个二分搜索的工作原理一样。相应的算法就叫做二进制搜索算法。 迭代版本算法: //iterative binary search which r... 阅读全文
posted @ 2015-08-10 20:53 programnote 阅读(241) 评论(0) 推荐(0) 编辑
摘要:如果数组元素已经排过序(升序),那我们搜索某个元素就不必遍历整个数组了。在下面给出的算法代码中,到任何一点,假设当前的arr[i]值大于搜索的值data,就可以停止搜索了。 #include // a function to search "data" in an array "arr" of size "size" // returns 1 if the element is present... 阅读全文
posted @ 2015-08-10 20:30 programnote 阅读(386) 评论(0) 推荐(0) 编辑
摘要:假定有一个元素顺序情况不明的数组。这种情况如果我们要搜索一个元素就要遍历整个数组,才能知道这个元素是否在数组中。 这种方法要检查整个数组,核对每个元素。下面是算法实现: #include // a function to search "data" in an array "arr" of size "size" // returns 1 if the element is present e... 阅读全文
posted @ 2015-08-10 20:14 programnote 阅读(563) 评论(0) 推荐(0) 编辑
摘要:C语言中,声明数组的语句: int arr[100]; 这样声明得到的数组里面的存储的是随机的我们不知道的数据,对用户来说就是垃圾。有许多情况我们要将数组初始化为全零的情况才能进行其他操作。 最简单的方法就是用一个循环吧数组所有元素设置为0: int arr[100]; int i = 0; for(i = 0 ; i < 100 ; i++) arr[i] = 0; //This wi... 阅读全文
posted @ 2015-08-10 19:54 programnote 阅读(70884) 评论(1) 推荐(3) 编辑
摘要:有时候我们需要在某个元素集合中找到最小值和最大值 。优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值(DeleteMax)的数据结构。 这两个操作和队列中的进队(EnQueue)和出队(DeQueue)操作很相似。区别就在于,在优先级队列中,数据进入的顺序与他们接受处理的顺序可能不同。就像工作日... 阅读全文
posted @ 2015-08-10 17:43 programnote 阅读(2675) 评论(0) 推荐(0) 编辑
摘要:我们有时看到这样地饿代码: int *ptr = &amp;x; 这里,ptr是一个指向x在内存中的地址的指针。 假设有另外一条语句是这样地的: int **ptr2 = &amp;ptr; 我们定义了一个指向指针的指针。 假设我们的计算机是8bit的,地址也是8bit(因此只有256字节的内存)。下图代表内存的一部分(上面的一排数字代表地址)。 45 55 56 57 ... 阅读全文
posted @ 2015-08-10 16:07 programnote 阅读(567) 评论(0) 推荐(0) 编辑
摘要:类似于链表和堆栈,队列也是存储数据的结构。队列中数据进入队列的顺序很重要,一般来说,队列就是一群人或者事物按照排好的顺序等待接受服务或者处理。 定义:队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 和堆栈一样的,也有两种... 阅读全文
posted @ 2015-08-10 10:24 programnote 阅读(3026) 评论(0) 推荐(0) 编辑
摘要:这是C语言中指针的基本用法之一,我们先来看一个小例子。下面是代码: int main(void) { char *p = "Hello"; while(*p++) printf("%c", *p); return 0; } 这段代码中第一句表达式: char *p = "Hello"; 声明了指向char类型的指针p,当我们说“指向char类型的指针”时... 阅读全文
posted @ 2015-08-09 19:58 programnote 阅读(1085) 评论(0) 推荐(0) 编辑
摘要:我们学习的算法中的表达式有中缀、前缀和后缀之分,到底有什么区别呢? 中缀(INFIX) 中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符。 AA + B(A + B) + (C – D) 前缀(PREFIX) 前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数。 A+ A... 阅读全文
posted @ 2015-08-09 17:55 programnote 阅读(2096) 评论(0) 推荐(0) 编辑
摘要:类似于队列,堆栈是个简单的数据存储结构。堆栈中数据进出的顺序很重要,举个例子,餐厅的盘子堆,盘子洗完要堆到上面,而不是插到下面的某个位置(相信不会有人那么做)。当厨师要用到盘子时从最上面的开始拿。即最先放在堆里的盘子会被最后一个用到。 定义:堆栈就是只能在一端插入和删除数据的链表,这个端就叫做栈顶(top),最后一个添加的数据第一个被删除。因此,这也叫后进先出(LAST IN FIRST OUT)... 阅读全文
posted @ 2015-08-09 08:56 programnote 阅读(11719) 评论(0) 推荐(1) 编辑
摘要:初入门的我们经常听见别人说“真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言。”那么和其他语言相比C语言到底有什么特别的呢? C语言没有什么特别,这就是它快速的秘诀。 新的语言支持更多的特性,比如,垃圾回收(garbage collection),动态类型(dynamic typing)等等。这些新加入的特性让出学者们更容易上手。 问题的关键就在于,这些新的功能增加了处理开销(... 阅读全文
posted @ 2015-08-08 21:12 programnote 阅读(4262) 评论(0) 推荐(1) 编辑
摘要:回溯法是分治穷举搜索的一个方法。有点绕人,我复制wiki的解释如下:回溯法(英语:backtracking)是暴力搜寻法中的一种。回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,... 阅读全文
posted @ 2015-08-08 18:00 programnote 阅读(1687) 评论(0) 推荐(0) 编辑
摘要:void binary(int n) { if(n #include char A[4]; /* Code obtained from http://www.studyalgorithms.com */ void binary(int n) { if(n < 1) printf("%s\n",A); // Assume A is a global va... 阅读全文
posted @ 2015-08-08 17:58 programnote 阅读(217) 评论(0) 推荐(0) 编辑
摘要:汉诺塔是数学上的一个谜题。有三根杆子,一些不同大小的中间有孔的圆盘,可以按大小顺序套在杆子上,最小的在最上面,堆成类似锥形的结构。问题是怎么把一根杆子上的一堆圆盘移动到另一根杆子上,限定条件如下: 一次只能移动一个圆盘。 每一次移动步骤包括将一根杆子最上面的圆盘移开放到另一根杆子上圆盘的最上层(不能动下面的盘子)。 所有大圆盘的下面不能有比他小的圆盘。 算法步骤(有n个圆盘,三根杆子分别为A,B... 阅读全文
posted @ 2015-08-08 17:17 programnote 阅读(367) 评论(0) 推荐(0) 编辑
摘要:每一次递归调用都将过程(精确地说是“变量”)在内存中复制一遍。一旦一个过程结束(会返回一些数据),这个过程在内存中的副本就被丢弃。递归看似简单,但是可视化跟踪执行过程就很花费时间。好了,让我们来看下面的例子: int Print(int n) //print numbers 1 to n backwards { if(n == 0) return 0; else ... 阅读全文
posted @ 2015-08-08 16:38 programnote 阅读(2670) 评论(0) 推荐(0) 编辑
摘要:什么是递归? 任何函数调用自己都叫做递归,不管是直接的还是间接的,递归方法通过调用自己来解决一个问题的一部分。这就叫递归步骤。递归步骤一般会引发一系列的递归(当然了这是废话,不然就不叫做递归了)。这里面有一个重要的点就是要确保你的递归函数有个终止条件(不然的话就出不来了)。每一次的递归都是解决原问题的一个小问题,并且这个小问题是原问题的一个副本(像套娃一样,一层比一层小但是除了代销其他方面都很相似... 阅读全文
posted @ 2015-08-08 16:23 programnote 阅读(295) 评论(0) 推荐(0) 编辑