上一页 1 ··· 5 6 7 8 9

2012年3月8日

关于函数调用和尾递归的一点认识

摘要: 函数调用在大多数支持块结构的程序设计语言都支持函数或者子程序(函数和子程序的区别在于函数有返回值而子程序没有,在这里我们不区分这两个概念)。在进行函数调用和从函数返回时通常由一个被称为控制栈的运行时刻栈进行管理。每一个活跃的函数在控制栈中都会有一个相对应的活动记录,有时也称为栈帧。活动记录存储着函数调用时传递的参数信息和从函数返回时返回值与控制跳转的信息。函数的活动记录需要包括下面的信息控制链(control link):指向控制栈中前一个活动记录的指针;访问链(access link):指向源程序中最近的外层块对应的活动记录,用于维护静态作用域(本文中不讨论);返回地址:函数调用结束后被执行 阅读全文

posted @ 2012-03-08 18:00 lienhua34 阅读(2865) 评论(4) 推荐(4) 编辑

2012年3月5日

可计算性与停机问题

摘要: 可计算性可计算性理论明确了在理论上可计算的函数应具有的特征。那些定义在自然数集上的、理论上可计算的函数通常被称为部分递归函数。概念中强调“理论上可计算”,是因为某些可计算函数在实际计算中可能会耗费相当长的计算时间,可能在我们宇宙现存时间内都无法完成其计算。直观地说,如果存在一段程序来计算一个函数,那么这个函数就是可计算的。更明确地说,如果对于函数f: A -> B存在一个算法,以任意x∈A作为输入,都可以得到y = f(x)作为输出,则这个函数是可计算的。在20世纪30年代,普林斯顿大学的Alonzo Church提出了一个重要的原理,称为Church理论。Church理论是关于数学定义 阅读全文

posted @ 2012-03-05 22:24 lienhua34 阅读(5359) 评论(0) 推荐(0) 编辑

2012年2月15日

利用二分查找在循环递增数组中检索一个元素

摘要: 这是我在校园招聘面试时被问到的一个问题。问题是: 在一个循环递增数组中检索一个元素的时间复杂度较低的算法。所谓循环递增数组就是,假设一个长度为n的数组A,存在一个有效下标r(下标从0开始),使得将子数组A[0...r]拼接到子数组A[r+1...n-1]后面得到一个严格递增数组(A[i...j]表示数组A的从下标i开始到下标j结束的所有元素组成的子数组)。严格递增数组是循环递增数组的一个特例。下面是一个循环递增数组的例子, 5,6,7,8,9,0,1,2,3,4 将子数组(5,6,7,8,9)拼接到子数组(0,1,2,3,4)后面就得到一个严格递增数组(0,1,2,3,4,5,6,7,8,9. 阅读全文

posted @ 2012-02-15 15:40 lienhua34 阅读(1745) 评论(0) 推荐(0) 编辑

2011年12月6日

利用最大堆和最小堆在线寻找中位数

摘要: 题外话: 前段时间参加校园招聘,经常在一些公司的笔试或者面试中遇到一些不错的算法题,回到宿舍和同学进行交流,收获许多。这段时间,工作定下来后,整天闲着没事,就整理之前一些不错的算法题及其想法。下面这个算法题是一个同学去参加百度校园招聘面试时遇到的题目,当时他写了一篇日志。看到他那篇日志,我和舍友小平同学讨论了两三个小时。下面对当时的想法进行一些整理。 问题: 给定n个int型的数和一个空的集合,每次往集合中插入一个数,每次插入之后给出这个集合的中位数。(中位数的概念是:如果集合有奇数个数,给出排序后处在最中间的那个数;如果是偶数个数,给出排序后最中间两个数的均值。) 分析: 该同学在日记里.. 阅读全文

posted @ 2011-12-06 13:54 lienhua34 阅读(5491) 评论(0) 推荐(1) 编辑

上一页 1 ··· 5 6 7 8 9

导航