随笔分类 -  Algorithms

some simple Algorithms maybe helpful
摘要:假定有一个元素顺序情况不明的数组。这种情况如果我们要搜索一个元素就要遍历整个数组,才能知道这个元素是否在数组中。 这种方法要检查整个数组,核对每个元素。下面是算法实现: #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 阅读(583) 评论(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 阅读(71081) 评论(1) 推荐(3)
摘要:有时候我们需要在某个元素集合中找到最小值和最大值 。优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值(DeleteMax)的数据结构。 这两个操作和队列中的进队(EnQueue)和出队(DeQueue)操作很相似。区别就在于,在优先级队列中,数据进入的顺序与他们接受处理的顺序可能不同。就像工作日... 阅读全文
posted @ 2015-08-10 17:43 programnote 阅读(2703) 评论(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 阅读(585) 评论(0) 推荐(0)
摘要:类似于链表和堆栈,队列也是存储数据的结构。队列中数据进入队列的顺序很重要,一般来说,队列就是一群人或者事物按照排好的顺序等待接受服务或者处理。 定义:队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 和堆栈一样的,也有两种... 阅读全文
posted @ 2015-08-10 10:24 programnote 阅读(3103) 评论(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 阅读(1186) 评论(0) 推荐(0)
摘要:我们学习的算法中的表达式有中缀、前缀和后缀之分,到底有什么区别呢? 中缀(INFIX) 中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符。 AA + B(A + B) + (C – D) 前缀(PREFIX) 前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数。 A+ A... 阅读全文
posted @ 2015-08-09 17:55 programnote 阅读(2331) 评论(0) 推荐(0)
摘要:类似于队列,堆栈是个简单的数据存储结构。堆栈中数据进出的顺序很重要,举个例子,餐厅的盘子堆,盘子洗完要堆到上面,而不是插到下面的某个位置(相信不会有人那么做)。当厨师要用到盘子时从最上面的开始拿。即最先放在堆里的盘子会被最后一个用到。 定义:堆栈就是只能在一端插入和删除数据的链表,这个端就叫做栈顶(top),最后一个添加的数据第一个被删除。因此,这也叫后进先出(LAST IN FIRST OUT)... 阅读全文
posted @ 2015-08-09 08:56 programnote 阅读(11928) 评论(0) 推荐(1)
摘要:初入门的我们经常听见别人说“真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言。”那么和其他语言相比C语言到底有什么特别的呢? C语言没有什么特别,这就是它快速的秘诀。 新的语言支持更多的特性,比如,垃圾回收(garbage collection),动态类型(dynamic typing)等等。这些新加入的特性让出学者们更容易上手。 问题的关键就在于,这些新的功能增加了处理开销(... 阅读全文
posted @ 2015-08-08 21:12 programnote 阅读(4317) 评论(0) 推荐(1)
摘要:回溯法是分治穷举搜索的一个方法。有点绕人,我复制wiki的解释如下:回溯法(英语:backtracking)是暴力搜寻法中的一种。回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,... 阅读全文
posted @ 2015-08-08 18:00 programnote 阅读(1745) 评论(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 阅读(232) 评论(0) 推荐(0)
摘要:汉诺塔是数学上的一个谜题。有三根杆子,一些不同大小的中间有孔的圆盘,可以按大小顺序套在杆子上,最小的在最上面,堆成类似锥形的结构。问题是怎么把一根杆子上的一堆圆盘移动到另一根杆子上,限定条件如下: 一次只能移动一个圆盘。 每一次移动步骤包括将一根杆子最上面的圆盘移开放到另一根杆子上圆盘的最上层(不能动下面的盘子)。 所有大圆盘的下面不能有比他小的圆盘。 算法步骤(有n个圆盘,三根杆子分别为A,B... 阅读全文
posted @ 2015-08-08 17:17 programnote 阅读(385) 评论(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 阅读(2696) 评论(0) 推荐(0)
摘要:什么是递归? 任何函数调用自己都叫做递归,不管是直接的还是间接的,递归方法通过调用自己来解决一个问题的一部分。这就叫递归步骤。递归步骤一般会引发一系列的递归(当然了这是废话,不然就不叫做递归了)。这里面有一个重要的点就是要确保你的递归函数有个终止条件(不然的话就出不来了)。每一次的递归都是解决原问题的一个小问题,并且这个小问题是原问题的一个副本(像套娃一样,一层比一层小但是除了代销其他方面都很相似... 阅读全文
posted @ 2015-08-08 16:23 programnote 阅读(304) 评论(0) 推荐(0)
摘要:Question: You are given a function rand7() – that generates random numbers from 1-7. Write a function rand10() – that uses rand7() to generate random numbers from 1-10. 这是一个概率分析的问题,你应该对期望值的概念很清楚,概率分析... 阅读全文
posted @ 2015-07-31 12:15 programnote 阅读(745) 评论(0) 推荐(0)
摘要:Question: You are given two axis-aligned rectangles. You have to determine if these rectangles overlap each other or not.Rectangle 1 : P1 (x, y), P2 (x,y)Rectangle 2 : P3 (x, y), P4 (x,y) 这个问题给出两个长方形... 阅读全文
posted @ 2015-07-31 11:03 programnote 阅读(2409) 评论(0) 推荐(0)
摘要:Question: Given an Integer, you need to determine if it is a palindrome or not. You should not use any extra space in the process.Input: 121Output: Palindrome 咋一看问题很简单,我们只要镜像翻转这个数看是否和原来的数一样。但是这题的要求有个... 阅读全文
posted @ 2015-07-31 10:34 programnote 阅读(899) 评论(0) 推荐(0)
摘要:分治算法将一个大的问题分成多个小问题,每个小问题都是大问题的组成部分,然后用点额外的处理就能得到最终答案。例如,归并排序就是将原问题分成两个次级的问题,每个次级排序问题数据是上一级问题的一半,最后使用额外O(n)的工作量进行合并。时间复杂度表达式如下: T(n) = 2T(n/2) + O(n) 下面的理论可用于计算分治算法的时间花费。对于一个给定程序(或算法),首先找到问题的重现关系(时间复杂度... 阅读全文
posted @ 2015-07-30 17:22 programnote 阅读(247) 评论(0) 推荐(0)
摘要:为了分析给定的算法,我们需要找到什么输入算法花费时间较短,什么输入算法的花费时间较长。我们已经知道算法的时间花费可以以表达式的形式给出来,我们给出多个表达式:一个对应花费时间最少的情况,其他的分别对应时间花费更多的情况,一般的: 最坏的情况: 界定会让算法表现最差(时间最长)的输入数据。 输入这些数据。 最好的情况: 界定会让算法表现最好(时间最短)的输入数据。 输入这些数据。 一般(平均)情... 阅读全文
posted @ 2015-07-30 16:53 programnote 阅读(191) 评论(0) 推荐(0)
摘要:一个函数或算法的代码块花费的时间随输入增长的速率称为增长率。 假设你去买一辆小车和一辆自行车。如果你朋友刚好看到,问你在买什么,我们一般都会说:买小车。因为买小车比买自行车花费高多了。 【总花费=小车的花费+自行车的花费】 【总花费≈小车的花费(近似)】 对于上面的例子,我们用一个函数来表示买车的花费,这个函数忽略低阶指数的项(相对于高阶项,他们的对函数结果的影响很小)。下面这个例子中n4 , 2... 阅读全文
posted @ 2015-07-30 15:55 programnote 阅读(1867) 评论(0) 推荐(0)