HomeWork——Halt Problem

原创 2016年05月30日 10:44:39

初次接触halt problem,wiki百科和google了一下,大概讲的是对于某个程序P,给出某种输入I,求解此程序P是否会达到终止状态。更通俗的说,一个程序说:“我能预测别的程序是否能够breakdown停机”的问题。如果没有接触这样的一个问题,像我一样,估计觉得这个程序简直不知道在干什么,而且觉得这似乎是个哲学方面的问题?

引用一下维基百科上面的表述(Halting Problem):是目前逻辑数学的焦点,和第三次数学危机的解决方案。其本质是给定一个图灵机T,和一个任意语言集合S,是否T会最终停机于每一个s属于S。其意义相同于可确定语言。显然任意有限S时刻判定的,可数的S也是可停机的。

当然,这个命题现在已经被证明是 不可解问题 了。证明如下:如果这个问题可以在有限的时间之内解决,可以有一个程序判断其本身是否停机并做出相反行为。这时候,不管停不停机结果是什么都不符合要求。这么说还是有点抽象。不如用一个对话来解释之。

一个程序A:“我能判断所有程序能否停机。”

另一个程序B:“如果我是你就这么玩,给我任意一个程序,要是你判断停了,我就变成死循环”。

之后王老师说:“如果你自己给你自己呢,即自己判断自己呢?”

那就有两种情况了,第一,如果B(B)停了,根据程序B,变成了死循环,而B又被A验证停不了。第二,如果B(B)停不了,根据程序B,B能被A验证可以停。

这充满了矛盾不是吗?

这里给出一个我在网站看到的证明该命题的伪代码:

int H(procedure, Input); // 这里的H函数有两种返回值,死循环或停机

int K(P) {

if (H(P, P) == 死循环) {

return 停机;

} else {

while(1)  // 这里会死循环

}

}

由停机问题引发的诸多不可解问题诸如理发师悖论:村子里有个理发师,这个理发师的原则是,对于村里的人,当且仅当这个人不自己理发,理发师就给他理发,如果这个人自己理发,理发师就不给他理发,无法回答的问题是,理发师给自己理发吗?

上述代码是否很简洁易懂呢?说了这么多,该讲讲本次homework的Halt Problem,事实上这并不是真正的Halt Problem。

问题可以简单表述为,给定几个函数传入另一个Decide判断函数,每一个函数内部还有个check函数,用来判断运行时间是否超时或内存是否超过其大小。整个程序总共会传入5个函数,规则是:1,Time Limit:1秒, Memory Limit:8MB, Function Input: 5。

该homework只需要我们定义Decide函数。

首先定义check函数,每个函数为void 函数(check c, int a, int b),且使用TIC(),TOC(),且函数输入有5个,其他方面也会占用一定时间,故临界值设为1000ms / 5 - 一定值 = 这里我定义为180。而检查内存时,其他方面也会占用内存,故临界值为sizeof(long long int) * v.size()是否大于8 * 1024KB * 1024B,v为STL的vector容器。

bool check() {
    if (time_now - time_begin > 180) {
        return true;
    }
    if (MEM_CHECK()) {
        return true;
    }
    return false;
}


之后的Decide函数,因为先前定义了func和check

  1. typedef bool (*check) ();
  2. typedef void (*func) (check, int, int);
所以传入func函数类型的形参f, 而f再传入已定义好的check函数即可。

void Decide(func f, int a, int b) {

    f(check, a, b);
}

总结:

本道题其实就是为我们科普了Halt Problem这个类哲学问题。以及看懂一个没有注释的代码需要花费很大功夫(微笑jpg)。最后,还考察了一下如何将一个函数传入一函数,

而该函数形参再调用另一个函数。不变的是函数形参一定有类型和名字,函数内部是可以调用外部已经定义好的函数的。

以上。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU Problem - 1789 Doing Homework again【贪心】

Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/...

hdoj problem 1789 Doing Homework again(贪心问题+优先队列)

Doing Homework again http://acm.hdu.edu.cn/showproblem.php?pid=1789 Time Limit: 1000/1000 MS (Java/...

Homework 1165 - C++作业第十章(主讲老师徐红云) Problem B: C++第十章习题2

建立结点包括一个任意类型数据域和一个指针域的单向链表类模板。在main函数中使用该类模板建立数据域为整型的单向链表,并倒序把链表中的数据输出。 Input 输入为若干组数据,每组数据用2行...

Homework 1165 - C++作业第十章(主讲老师徐红云)Problem D: C++第十章习题4

Problem D: C++第十章习题4 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 277  Solved: 168 [Submit][St...

杭电ACM1074——Doing Homework~~状态压缩DP

题目的意思:N门课程有作业,一个时间是最迟交的时间,一个是需要耗费多少时间来完成,到了期限,迟交多少,就扣多少分,求扣最少分的做作业的顺序。 N小于等于15,可以枚举所以的情况,数的二进制来表示各种情...

HomeWork——Valid Number

题目描述很简单,判断一个数是否为正确数字的格式,如下: Validate if a given string is numeric. Some examples: "0" => true " 0.1...

线性筛素数——Homework(2015 Facebook Hacker Cup)

题目: Your first-grade math teacher, Mr. Book, has just introduced you to an amazing new concept — pr...
  • FeBr2
  • FeBr2
  • 2016-07-12 10:45
  • 153

HomeWork——Binary Search Tree

本次作业是建立一个Binary Search Tree,二叉搜索树。 二叉搜索树,也叫做排序二叉树,它具有如下性质:若它的左树不为空,则左树上所有节点的值均小于它的根节点值;若它的右子树不空,则右树...

HDU1074——Doing Homework(状态压缩dp)

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)