当前位置: 首页 > news >正文

编程之美 2.12 快速寻找满足条件的两个数 解法三证明 (算法导论 第二版 2.3-7 在n个元素的集合S中找到两个和为x的元素)...

题目来源 : 《编程之美》 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

相关文章:

  • 几本好书,地铁上打发的收获--之二(还有其它)
  • 打鸡蛋和工作习惯
  • 几本好书,地铁上打发的收获
  • daemon函数实现原理 守护进程
  • 关于时间管理的一些沉淀
  • jquery-ajax、struts2、json数据问题
  • 说说嵌入式调试方式
  • 创建全文索引的sql语句和测试sql语句执行时间
  • 做软件要尊重事实
  • java中的值传递
  • CDMA学习笔记(一):历史和基本概况
  • 新学习的开始
  • 位图安全仿真系统
  • get 和 post
  • 图像标注说明系统
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • centos安装java运行环境jdk+tomcat
  • ComponentOne 2017 V2版本正式发布
  • CSS实用技巧干货
  • gops —— Go 程序诊断分析工具
  • JavaScript DOM 10 - 滚动
  • JavaScript设计模式系列一:工厂模式
  • jdbc就是这么简单
  • js操作时间(持续更新)
  • LeetCode29.两数相除 JavaScript
  • python_bomb----数据类型总结
  • SegmentFault 2015 Top Rank
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Terraform入门 - 3. 变更基础设施
  • 订阅Forge Viewer所有的事件
  • 反思总结然后整装待发
  • 排序算法之--选择排序
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 容器镜像
  • (C语言)fgets与fputs函数详解
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (转)人的集合论——移山之道
  • ***详解账号泄露:全球约1亿用户已泄露
  • .gitignore文件_Git:.gitignore
  • .md即markdown文件的基本常用编写语法
  • .naturalWidth 和naturalHeight属性,
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .py文件应该怎样打开?
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [20190416]完善shared latch测试脚本2.txt
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]C++类基本语法
  • [C语言]编译和链接
  • [Django ]Django 的数据库操作
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列