Coursera_ Algorithms I 学习笔记:Module_3_Analysis_of_Algorithm_Introduction

news2024/9/30 13:04:30

Coursera_ Algorithms I 学习笔记:Module_3_Analysis_of_Algorithm_Introduction

scientific method applied to analysis of algorithms

image-20240922161208066

data analysis

log-log plot

image-20240922164313773

doubling hypothesis

image-20240922164403430

experimental alogrithmics

  • System independent effects
  • System dependent effects

image-20240922170804779

some costs of basic operations

image-20240922174750728

tilde notation

image-20240922180256419

use calculus to estimate a discrete sum

Here I have a question: why Ex1. the result using sum equation is equal to the one using the calculus ???

  • Euler-Maclaurin公式——用连续和估计离散和

image-20240922184418134

mathematical models for running time

image-20240922185122638

binary search

proof to binary search

image-20240923152349097

Comparing programs between sorting-base algorithm and brute-force algorithm

image-20240923154349646

Theory of alogrithms

Types of analyses

  • best case
  • worst case
  • average case

An order of growth is a set of functions whose asymptotic growth behavior is considered equivalent. For example, 2n, 100n and n+1 belong to the same order of growth, which is written O(n) in Big-Oh notation and often called linear because every function in the set grows linearly with n.

commonly-used notations in the theory of alogrithms

image-20240928173545452

时阳光老师的课件上有形式化的描述

algorithm design approach

image-20240928201315737

这句话的意思是,算法理论中有很多已发表的研究,许多人误解了大O符号的结果。大O符号通常用于提供问题难度的改进上界,而不是作为运行时间的近似模型。换句话说,虽然大O表示了算法在最坏情况下的复杂度,但它并不一定能准确预测实际运行时间,因此将其当作实际运行时间的近似是一个错误。

Memory

typical memory usage for primitive types and arrays

image-20240928214349362

typical memory usage summary

  • Shallow memory usage: Don’t count referenced objects.
  • Deep memory usage: If array entry or instance variable is a reference, add memory (recursively) for referenced object

example

image-20240928220630243

二次时间内解决3-SUM问题

image-20240928235636267

关于复杂度这里有一点需要说明:内层循环的运行次数是n-1 + n-2 + n-3 + …… + 2 + 1,求和可知整个循环的时间复杂度是O(n^2)

search in a bitonical array

image-20240929151447120

answer

要在一个比特尼克数组中搜索一个整数,可以使用修改过的二分查找方法。下面是实现的思路和代码示例:

标准版本:约 (3 \lg n) 次比较

  1. 找到峰值:首先,找到比特尼克数组的峰值(最大元素)。可以通过修改二分查找在 ( O(\lg n) ) 时间内完成。
  2. 在两部分中查找
    • 在递增部分使用标准的二分查找。
    • 在递减部分使用标准的二分查找。

示例代码(Python):

def find_peak(arr):
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] > arr[mid + 1]:
            right = mid  # 在左侧部分查找
        else:
            left = mid + 1  # 在右侧部分查找
    return left  # 返回峰值索引

def binary_search(arr, left, right, target, ascending=True):
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        if ascending:
            if arr[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        else:
            if arr[mid] > target:
                left = mid + 1
            else:
                right = mid - 1
    return -1

def search_bitonic_array(arr, target):
    peak_index = find_peak(arr)
    # 在递增部分查找
    index = binary_search(arr, 0, peak_index, target, ascending=True)
    if index != -1:
        return index
    # 在递减部分查找
    return binary_search(arr, peak_index + 1, len(arr) - 1, target, ascending=False)

# 示例
bitonic_array = [1, 3, 8, 12, 4, 2]
target = 4
result = search_bitonic_array(bitonic_array, target)
print(result)  # 输出目标元素的索引

签名奖金版本:约 (2 \lg n) 次比较

直接搜索而不单独寻找峰值:我们不单独找到峰值,而是在搜索目标元素的同时利用比特尼克数组的性质。

  • 二分查找的修改
    • 先进行标准的二分查找,检查中间元素。
    • 如果中间元素等于目标,直接返回。
    • 如果中间元素大于其右邻居(说明在递增部分),则继续在左半部分和右半部分分别进行递归搜索。
    • 如果中间元素小于其右邻居,则说明在右半部分,继续在右半部分和左半部分分别进行递归搜索。

具体步骤

  1. 开始搜索

    • 设置初始的左右边界 leftright
    • 在每次迭代中计算中间索引 mid
  2. 比较并搜索

    • 如果 arr[mid] == target,返回 mid

    • 如果

      mid
      

      不是峰值:

      • 如果

        arr[mid] < arr[mid + 1]
        

        ,说明在递增部分:

        • 先在递增部分搜索 leftmid,然后再在递减部分搜索 mid + 1right
      • 如果

        arr[mid] > arr[mid + 1]
        

        ,说明在递减部分:

        • 先在递减部分搜索 midright,然后再在递增部分搜索 leftmid - 1

示例代码

def binary_search_bitonic(arr, left, right, target):
    if left > right:
        return -1

    mid = (left + right) // 2
    
    # 检查中间元素
    if arr[mid] == target:
        return mid

    # 如果 mid 不是峰值
    if mid < len(arr) - 1 and arr[mid] < arr[mid + 1]:
        # 在递增部分查找
        result = binary_search_bitonic(arr, left, mid - 1, target)
        if result != -1:
            return result
        # 在右侧部分查找
        return binary_search_bitonic(arr, mid + 1, right, target)
    else:
        # 在递减部分查找
        result = binary_search_bitonic(arr, mid + 1, right, target)
        if result != -1:
            return result
        # 在左侧部分查找
        return binary_search_bitonic(arr, left, mid - 1, target)

def search_bitonic_array(arr, target):
    return binary_search_bitonic(arr, 0, len(arr) - 1, target)

# 示例
bitonic_array = [1, 3, 8, 12, 4, 2]
target = 4
result = search_bitonic_array(bitonic_array, target)
print(result)  # 输出目标元素的索引

证明 (2 \lg n) 次比较的下限

对于比特尼克数组,任何搜索算法的比较次数至少要对数级别的,即每次比较都能排除一半的元素。由于我们在一个数组中进行两次查找(递增和递减),因此最坏情况下的比较次数是 (2 \lg n)。这是因为在最佳情况下,每次比较会将待查找元素范围减半,两个阶段的查找叠加导致了这个下限。

希望这能帮助你理解如何在比特尼克数组中搜索一个整数!如果有其他问题,欢迎提问。

扔鸡蛋问题

image-20240929155433588

好的,接下来我们详细解释 Version 2Version 4 的算法思路:


Version 2: (\sim \lg T) 个鸡蛋和 (\sim 2 \lg T) 次投掷

思路:

这个版本要求你用 ( \lg T ) 个鸡蛋,在 ( 2 \lg T ) 次投掷内找到鸡蛋破裂的临界楼层 ( T )。算法分两步:

  1. 找到包含 ( T ) 的区间

    • 你需要首先找到一个大小为 ( 2T ) 的区间,也就是从第 1 层到第 ( 2T ) 层。如果你知道了这个区间,你可以确定 ( T ) 肯定在这个范围内。
    • 为了找到这个区间,你可以采用指数增长的方法:从第 1 层开始,每次增加一倍,直到鸡蛋破裂为止。
      • 例如,先从第 1 层投掷,再从第 2 层、接着是第 4 层、8 层、16 层……直到某次投掷时鸡蛋破裂。
    • 这样,你找到一个区间 ( [2^{k-1}, 2^k] ),确保 ( T ) 在这个区间内。
  2. 在区间中做二分查找

    • 找到区间后,接下来可以用二分查找的方式来缩小范围。因为区间大小是 ( 2T ),在最坏情况下,二分查找会用 ( \lg T ) 次投掷找到临界楼层。
    • 在此过程中,你用了一次鸡蛋在第一步找区间,剩下的鸡蛋在第二步做二分查找。
总结:
  • 步骤 1:使用指数增长找到 ( T ) 所在的区间(约 ( \lg T ) 次投掷)。
  • 步骤 2:在区间内用二分查找(约 ( \lg T ) 次投掷)。
  • 整体算法在最坏情况下需要 ( 2 \lg T ) 次投掷。

Version 3: 2 个鸡蛋和 (\sim 2 \sqrt{n}) 次投掷

思路:

这个版本中只有两个鸡蛋,并且目标是在 ( 2\sqrt{n} ) 次投掷内找到临界楼层 ( T )。这里的思路是分段逐步查找。

  1. 找到大小为 ( \sqrt{n} ) 的区间

    • 由于只有 2 个鸡蛋,如果第一个鸡蛋破了,我们只能线性搜索剩余的楼层。因此,不能每次只上升一层投掷,而是每次跳过一个区间大小为 ( \sqrt{n} ) 的楼层。
    • 具体步骤是:从第 ( \sqrt{n} ) 层开始投掷,第 ( 2\sqrt{n} ) 层、第 ( 3\sqrt{n} ) 层……直到鸡蛋破裂。
    • 如果鸡蛋在某次投掷时破裂,那么 ( T ) 必然位于上一组区间内。
  2. 在找到的区间中线性搜索

    • 一旦鸡蛋破裂,我们就在上一个区间(例如从 ( (k-1)\sqrt{n} ) 到 ( k\sqrt{n} ))中逐层搜索,使用线性查找找到 ( T )。
总结:
  • 步骤 1:每次跳过 ( \sqrt{n} ) 楼层进行投掷,直到鸡蛋破裂。这个过程大约需要 ( \sqrt{n} ) 次投掷。
  • 步骤 2:一旦鸡蛋破裂,在确定的区间内线性查找,最多需要 ( \sqrt{n} ) 次。
  • 因此,总共大约需要 ( 2\sqrt{n} ) 次投掷。

Version 4: 2 个鸡蛋和 ( \leq c\sqrt{T} ) 次投掷

思路:

这个版本中你仍然只有 2 个鸡蛋,但目标是限制在 ( c\sqrt{T} ) 次投掷内找到 ( T ),其中 ( c ) 是常数。

  1. 逐步增加搜索范围

    • 在这种情况下,你从第 1 层开始,逐步递增楼层数进行投掷。你先从第 1 层投掷,然后第 3 层,再第 6 层,接着第 10 层……也就是每次递增的楼层数是逐步增加的:1, 2, 3, 4, 5…。
    • 这种方式确保你不会跳过可能的临界楼层 ( T ),并且能够有效减少总的投掷次数。
  2. 线性查找

    • 一旦鸡蛋破裂,你只需要在线性递增到的上一层开始线性查找即可。因为你是逐步递增的,所以不会跳过任何可能的临界楼层。
总结:
  • 这种方法的最大投掷次数是 ( 1 + 2 + 3 + … + t ),其中 ( t ) 是你最终达到的楼层。因此总的投掷次数约为 ( \frac{t(t + 1)}{2} ),满足 ( t \sim \sqrt{T} )。
  • 这意味着你总共需要 ( O(\sqrt{T}) ) 次投掷,并且 ( c ) 是一个常数,可以调整使得投掷次数符合题目要求。

总结:

  • Version 2 利用二分查找,先找到包含 ( T ) 的区间,然后在区间内做二分查找,总共需要 ( 2 \lg T ) 次投掷。
  • Version 3 通过每次跳 ( \sqrt{n} ) 楼层进行投掷,一旦鸡蛋破裂,在线性搜索剩余区间,总共需要 ( 2\sqrt{n} ) 次投掷。
  • Version 4 使用逐层递增的方式寻找 ( T ),投掷次数大约是 ( O(\sqrt{T}) ),总共 ( c\sqrt{T} ) 次投掷。

如果还有进一步的疑问或需要代码实现,可以继续告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

Clocking System

文章目录 1. 介绍2. 时钟源2.1 scillator Circuit (OSC)2.1.1 外部时钟输入模式2.1.2 外部晶体/陶瓷谐振器模式2.1.3 振荡器的配置2.1.4 Oscillator Watchdog 2.2 Back-up Clock 3. 锁相环&#xff08;PLL&#xff09;3.1 系统锁相环3.1.1 Features3.1.2 框图 3.2.外设锁相环3.…

JAVA云洋系统聚合快递打造一站式快递系统小程序源码

云洋系统聚合快递 —— 打造一站式快递管理新体验 &#x1f680; 一站式快递管理新时代 在快节奏的现代生活中&#xff0c;快递已经成为我们日常不可或缺的一部分。然而&#xff0c;面对众多快递公司和复杂的物流信息&#xff0c;如何高效管理快递成为了许多人的难题。幸运的是…

基于SpringBoot大学生就业管理系统设计与实现

1.1 研究背景 科学技术日新月异的如今&#xff0c;计算机在生活各个领域都占有重要的作用&#xff0c;尤其在信息管理方面&#xff0c;在这样的大背景下&#xff0c;学习计算机知识不仅仅是为了掌握一种技能&#xff0c;更重要的是能够让它真正地使用到实践中去&#xff0c;以…

从“抄袭”到“原创”:5个超实用的论文降重技巧!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 每当写完一篇论文&#xff0c;松了一口气准备庆祝时&#xff0c;突然想到还有一个名叫“查重”的终极大Boss等着你&#xff0c;瞬间心情从云端跌入谷底。 是不是你&#xff1f; 很多同学在提交之前&#…

CDGA|利用人工智能与边缘计算显著提升数据治理效率与效果的实践案例

在当今数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何高效、安全地治理这些数据成为企业面临的重要挑战。人工智能&#xff08;AI&#xff09;与边缘计算技术的融合&#xff0c;为数据治理带来了前所…

《程序猿之Redis缓存实战 · 哈希类型》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

《ToDesk 云电脑、易腾云、青椒云移动端体验实测:让手机秒变超级电脑》

前言 科技发展到如今2024年&#xff0c;可以说每一年都在发生翻天覆地的变化。云电脑这个市场近年来迅速发展&#xff0c;无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验&#xff0c;并且移动端也可以带来非凡体验。我们在外出办公随身没有携带电脑情况下&#x…

聊一聊大模型六小虎生存现状!

ChatGPT横空出世&#xff0c;打响了生成式AI创业热潮的发令枪。 在国内&#xff0c;智谱AI、百川智能、零一万物、月之暗面、Minimax率先领跑。今年6月&#xff0c;前微软全球副总裁姜大昕创办的阶跃星辰&#xff0c;开始受到资本的青睐&#xff0c;一轮20亿美元的融资&#x…

服务器使用frp做内网穿透详细教程,请码住

目录 1.内网穿透的定义 2.前提条件 3.frp下载地址 4.配置服务器端的frps.toml文件 5. 配置客户端&#xff0c;即物理服务器或者是电脑本机地址 6.添加服务端启动命令startServerFrp.sh 7.添加客户端启动命令startClientFrp.sh 8. 查看服务端启动日志 9.查看客户端启…

HTML+CSS - 表单交互(一)

1. 前言 ​​​​​​​ Web 表单是用于和用户交互的强大工具——其常用于收集用户数据和控制用户界面。 web 表单是用户和 web 站点或应用程序之间交互的主要内容之一。它们允许用户输入数据&#xff0c;大多数情况下会将数据发送到 web 服务器进行处理和存储 2. form标签 …

数据飞轮赋能科学决策:火山引擎 DataTester 升级 A/B 大模型评测

在数字化浪潮的推动下&#xff0c;企业数据化转型已成为不可逆转的时代趋势。随着企业对数据价值认知的深化&#xff0c;从优化数据管理到内部数据普惠&#xff0c;再到数据资产价值的充分挖掘&#xff0c;数据产品需求呈现爆发式增长。作为推动企业数智化升级的新范式&#xf…

数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块

9月24日&#xff0c;2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上&#xff0c;中国信通院发布了2024年《高质量数字化转型产品及服务全景图&#xff08;上半年度&#xff09;》和《高质量数字化转型技术解决方案&#xff08;上半年度&#xff09;》等多项…

解决银河麒麟操作系统“/dev/root does not exist”错误的快速方法

解决银河麒麟操作系统“/dev/root does not exist”错误的快速方法 1、步骤2、注意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在安装系统时遇到“/dev/root does not exist”错误&#xff0c;通常是因为引导程序未正确设置启动设备。以…

golang学习笔记27-反射【重要】

本节也是GO核心部分&#xff0c;很重要。包括基本类型的反射&#xff0c;结构体类型的反射&#xff0c;类别方法Kind()&#xff0c;修改变量的值。 目录 一、概念&#xff0c;基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念&#xff0c;基本…

Linux云计算 |【第四阶段】RDBMS1-DAY3

主要内容&#xff1a; 子查询&#xff08;单行单列、多行单列、单行多列、多行多列&#xff09;、分页查询limit、联合查询union、插入语句、修改语句、删除语句 一、子查询 子查询就是指的在一个完整的查询语句之中&#xff0c;嵌套若干个不同功能的小查询&#xff0c;从而一…

STM32 OLED

文章目录 前言一、OLED是什么&#xff1f;二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…

第L2周:机器学习|线性回归模型 LinearRegression:2. 多元线性回归模型

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务&#xff1a; ●1. 学习本文的多元线形回归模型。 ●2. 参考文本预测花瓣宽度的方法&#xff0c;选用其他三个变量来预测花瓣长度。 一、多元线性回归 简单线性回归&#xff1a;影响 Y 的因素唯一&…

python15_转换为ASCII

转换为ASCII A A B 你好 C 66def str_to_ascii(s):# 如果输入是单个字符&#xff0c;直接返回其ASCII值if len(s) 1:return ord(s)# 否则返回每个字符的ASCII值列表return [ord(char) for char in s]def int_to_ascii(i):# 将整数转换为对应的ASCII字符return chr(i)if __…

气膜仓库出售:智能高效的新选择—轻空间

随着现代物流和仓储需求的不断增长&#xff0c;传统仓库模式已经难以满足市场的多样化需求。气膜仓库凭借其灵活性、高效性和智能化的特点&#xff0c;成为仓储领域的新宠&#xff0c;而现在&#xff0c;我们推出了全新方向——气膜仓库出售&#xff0c;为企业提供更加灵活的资…