博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)...
阅读量:4681 次
发布时间:2019-06-09

本文共 717 字,大约阅读时间需要 2 分钟。

题目来源 : 《编程之美》 2.12 快速寻找满足条件的两个数, Page 177

【问题描述】

      快速找出一个长度为 N 的数组 A 中的两个数字,让这两个数字的和为一个给定的数字 S 。

【伪代码】

1 sort(A) // ascending order, O(N*logN) 2  3 int i = 0, j = N - 1;   4 while (i < j) { 5     if (A[i] + A[j] == S) { 6         The answer has been found !!! 7         break; 8     } else if (A[i] + A[j] < S) { 9         i++;10     } else {11         j--;12     }13 }14 15 The answer does not exsit !!!

      时间复杂度: O(N*logN) + O(N) = O(N*logN)

【形式化证明】

      循环不变式:

   

 

    1. 在第一轮迭代之前,不变式显然成立。

    2. 设前 k 轮迭代能够保持不变式成立, 则在 k+1 轮:
      (1) 若找到答案,则结束循环;
      (2) 否则,由于数组是有序的并且前 k 轮不变式成立,在执行 i++ (ln 9)或 j-- (ln 11)后,不变式仍成立。 
    3. 循环结束后,若未找到答案,则 i = j, 由循环不变式可知不存在所要求的答案

转载于:https://www.cnblogs.com/william-cheung/p/3474355.html

你可能感兴趣的文章
USACO hamming
查看>>
[开源JVM] yvm - 自制Java虚拟机
查看>>
Open vSwitch安装
查看>>
HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
查看>>
document.domain 跨域问题[转]
查看>>
【Android】 No Activity found to handle Intent.
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
Struts2 Action名称的搜索顺序
查看>>
C++ sort简单用法
查看>>
Oracle分区索引
查看>>
4.17上午
查看>>
IIS的ISAPI接口简介
查看>>
python:open/文件操作
查看>>
16 乘法口诀输出
查看>>
mac 常用地址
查看>>
鼠标经过切换图片
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
C程序的启动和终止
查看>>