如何证明伪代码有效?

如何解决如何证明伪代码有效?

忍受我;因为这是我第一次在stackoverflow上问一些问题。 我最近在“数据结构和算法简介”中进行了一次考试(可能失败了),并且正在尝试使之有意义。 问题之一,给出以下伪代码:

majority(A[1...n])
1.index <- 1
2.candidate <- NIL
3.counter <- 0
4.while index<=n
5.   do if counter = 0
6.       then candidate <- A[index]
7.            counter <- counter + 1
8.       else if candidate = A[index]
9.          then counter <- counter + 1
10.      else counter <- counter - 1
11.    index <- index + 1
12.return candidate

a。证明如果一个元素在数组中出现的次数超过n / 2次,则 算法将返回该值。 提示:每次计数器归零时,哪个语句保持为真?

如此直观,每次计数器归零时,保持为真的语句为 直到阵列中的这一点,我们都没有找到一个出现次数超过所有次数的元素 因此,如果元素出现的次数超过n / 2次,则其他元素组合在一起 然后再加上其他元素,最后我们将计数器> 0保留,并且大多数 元素是候选人。

但是,我不明白证明这一事实意味着什么。 我应该使用数学归纳法来证明这一点吗?

尝试数学归纳法

Induction hypothesis:
If an element e appears m times when m>n/2 then the code will return e.


Base case: n=3 => n/2=1 therefore m=2 or m=3.
if m=2 and array is (e,e,a) then counter->0->1->2->1 while candidate->NIL->e therefore e will be returned.
if m=2 and array is (e,a,e) then counter->0->1->0->1->0->1 while candidate->NIL->e->a->e therefore e will be returned.
if m=2 and array is (a,e) then counter->0->1->0->1->2 while candidate->NIL->a->e therefore e will be returned.
if m=3 array is (e,e) then counter->0->1->2->3 while candidate->NIL->e therefore e will be returned.

Assume induction hypothesis is true for array size n.
if array is size n+1 then element e appears m>(n+1)/2 times.
since m>n/2 then if we scan sub array A[1...n] then we would return e as per the induction hypothesis
meaning that after element A[n] we have candidate = e and counter>=1.
if counter>1 a[n+1] doesn't matter and we return e.

if counter=1 and a[n+1] is not e then we will not return e.
if counter=1 after sub-array A[1...n] then m=(n+1)/2...I will prove that later.
since m>((n+1)/2 we reached a contradiction and counter>1 necessarily.
Therefore for an array size n+1 and m>(n+1)/2 we will return e.
Thus ends the induction.

proving that if (candidate=e and counter=1 at the end of function) then m = (n+1)/2:
given an array A[1...n] lets name the number of elements which aren't e as k.
since m>n/2 then k<n/2.
since for each e element we get +1 to counter m contributes +m to counter.
since for each non e element we get -1 to counter k contributes -k to counter.
since we know that candidate=e and counter=1 then that means:
(m=k+1) => (k+1>n/2) => (k+1>n/2>k) => (2>n-2*k>0) => (n-2*k=1) => (k=(n-1)/2) => (m=k+1=(n+1)/2)
end of proof

这是我应该做的吗? 这是一个15/100分的问题,这是预期目的还是 有没有更简单的方法来解决这个问题? 我会很感激任何人都可以提供的帮助。

如果有人感兴趣,这是c中的代码:

#include <stdio.h>

int majority(int A[],int size);

int main()
{
    int A[9] = {1,2,3,1,3};
    int size = sizeof(A)/sizeof(A[0]);
    majority(A,size);

    return 0;
}

int majority(int A[],int size)
{
    int index = 0;
    int* candidate = NULL;
    int counter = 0;

    while(index < size)
    {
        if(counter == 0)
        {
            candidate = &(A[index]);
        }
        else if(*candidate == A[index])
        {
            counter++;
        }
        else
        {
            counter--;
        }
        index++;
    }
    printf("%d",*candidate);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-