Stanford-Coursera 算法Week1 笔记

题外话:全文免费放心食用,作者在此求个 三连+关注

1. Integer Multiplication(引入)

(很小的时候我们就学过:两个数字相乘的算法——将输入(两个数字)转换为输出(它们的乘积)的一组定义良好的规则;算法就是类似的:一个计算问题(输入和期望的输出),然后描述一个或多个解决该问题的算法)

1)定义计算问题:在整数乘法问题中,输入是两个n位数,我们称之为x和y, x和y的长度n可以是任意正整数;整数乘法问题的期望输出就是x·y

2)定义primitive operations:

     (i) 两个个位数相加;(ii) 两个个位数相乘;(iii)在数字的开头或结尾添加零  

e.g:  x = 5678 and y = 1234 (so n = 4).

计算会有n=4行,每行最多2n个操作(primitive operations)

所以最多会有 n · 2n 次 primitive operations

3)改进——下一节 3Karatsuba Multiplication

2.Karatsuba Multiplication

1)为了将x的前半部分和后半部分看作独立的数字,a = 56,b = 78,c = 12,d = 34

2)执行一系列只涉及两位数a, b, c和d的运算

3)将所有项集合在一起,得到x和y的乘积

第一步:计算a·c = 56·12 = 672

第二步:计算b·d = 78·34 = 2652

第三步:计算(a + b)·(c + d) = 134·46 = 6164

第四步:用第三步的结果减去前两步的结果:6164 - 672 - 2652 = 2840

第五步:计算104·672 + 102·2840 + 2652 = 6720000 + 284000 + 2652 = 70066552

2.1  A Recursive Algorithm(引入方便理解)

整数乘法递归方法

偶数n位:

伪代码(有个印象就行):

2.2 转回Karatsuba乘法

Karatsuba乘法是RecIntMult算法的优化版本

我们并不真正关心a·d或b·c,而是它们的和a·d + b·c

因此:只有个量——a·c, a·d + b·c和b·d

Step 1: Recursively递归 compute a · c 

Step 2: Recursively compute b · d

Step 3: Compute a + b and c + d , and recursively compute (a + b) · (c + d)——至此:三次递归

Step 4:用Step 3的结果减去前两步的结果,得到a·d + b·c

Step 5:乘10n次方在step 1的answer,乘10(n/2)次方在step 3的answer,最后把所有结果相加

因此,Karatsuba乘法只进行三次递归调用! 节省递归调用可以节省总体运行时间

3.MergeSort Algorithm

特点

  • Canonical divide-and-conquer algorithm 规范的分治算法:将问题分解为更小的子问题,递归地求解子问题,最后将子问题的解合并为原始问题的解
3.1 Sorting—拓展:十种基本的排序

1.0 十大经典排序算法 | 菜鸟教程 (runoob.com)

3.2 MergeSort—Example

1.递归

As a recursive divide-and-conquer algorithm作为递归分治算法, MergeSort 拆分成了两部分进行递归;第一组递归对前半部分进行排序,返回数组{1,4,5,8};第二组递归调用返回数组{2,3,6,7};最后合并两组

2.合并 Merge Subroutine 子程序

使用索引 k 遍历输出数组,并使用索引 i 和 j 遍历已排序的子数组。所有三个数组都是从左到右遍历的

第3行中的for循环实现了对输出数组的传递。在第一次迭代中,子例程识别C或D中的最小元素,并将其复制到输出数组b的第一个位置。总的来说,最小元素要么在C中(在这种情况下,它是C[1],因为C是排序的),要么在D中(在这种情况下,它是D[1],因为D是排序的)。

3.3 MergeSort—分析

因为mergesort相当于是递归+merge,所以会涉及到对递归树的分析

层数计算:

每一层的子问题&子问题大小:

4. Asymptotic Analysis 渐进分析

4.1 Big-O Notation 基础

是什么?

  • 为了讨论算法的设计和分析——为讨论算法的high-level performance提供了一个最佳点
  • 粗糙:压制住想要忽略的细节,细节取决于architecture、programming language、compiler...
  • 敏锐:常见问题的不同高级算法间进行预测性比较,尤其是large inputs

 “O”---为了找到解决问题的最佳高级算法

意思就是:

suppress constant factors & lower-order terms

抑制常数项和低阶项

结合下面例子:

抑制6n和“6”

所以running time是“big-O of nlog n” 即  O(nlogn)

例子1:

running time:O(n)

例子2:

running time:O(n)

为啥呢?其实是2n但2被抑制了

例子3:

running time:O(n^{2})

例子4:

running time:O(n^{2})

解释:外部循环从1到n,内部循环从i+1到n。内部循环的迭代次数取决于外部循环的当前迭代次数。

考虑最坏的情况,数组A中的所有元素都是相同的。在这种情况下,内部循环的迭代次数为: 1 + 2 + 3 + ... + (n-1) = n*(n-1)/2,总的迭代次数为n*(n-1)/2

4.2 Big-O Notation 正式定义

Big-O notation 关注 T(n),n = 1, 2,....

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

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

相关文章

网络安全资源和参考指南

由美国国防部(DoD)发布的《网络安全资源和参考指南》,旨在为美国政府、商业部门以及美国盟友和伙伴之间的安全合作提供有用的、现成的参考资料。文档涵盖了网络安全规范、最佳实践、政策和标准,这些都是由美国联邦政府、国防部以及…

vue3实现excel导出

前言&#xff1a;在开发一些管理系统的时候&#xff0c;常常会遇到表格导入导出的问题&#xff0c;总的来说呢&#xff0c;代码模板也挺固定的&#xff0c;仅以此博客作为记录以供参考 html部分 <Button click"downLoadPlan" type"primary">导出方案…

软件测试学习

软件测试学习 编辑时间&#xff1a;2024/5/17 0.理论学习 第一单元 Q开发工程师和测试工程师的关系理解 Q软件测试的目的和原则&#xff0c;识记、理解 为什么要进行软件测试 软件产品最终具备哪些功能由客户需求决定&#xff0c;客户需求如何转化为最终的软件产品要…

Java8 Optional常用方法使用场景

前言&#xff1a; Optional 是 Java 8 的新特性&#xff0c;专治空指针异常&#xff08;NullPointerException, 简称 NPE&#xff09;问题&#xff0c;它是一个容器类&#xff0c;里面只存储一个元素&#xff08;这点不同于 Conllection&#xff09;。 为方便用户通过 Lambda 表…

Wpf 使用 Prism 实战开发Day23

自定义对话框服务 当原有对话框不能满足需求的时候&#xff0c;可以通过自定义对话框来实现特殊的需求 一.自定义对话框主机服务步骤&#xff1a; 1.建立一个IDialogHostService 接口类&#xff0c;继承自 IDialogService 对话框服务类。并且自定义基类的服务方法。 public …

mac电脑安装python的spacy

打开终端&#xff1a;你可以通过在Finder中打开应用程序 > 实用工具 > 终端&#xff0c;或者使用Spotlight搜索终端来打开它。 确认Python环境&#xff1a;在安装spacy之前&#xff0c;确认你使用的Python环境。如果你有多个Python版本&#xff0c;确保你使用的是正确的…

Java - Scanner类

Scanner类 scanner 是 Java 中的一个类。类是一个构造块&#xff0c;它定义了创建某些类型的对象&#xff08;实例&#xff09;时它们的属性和行为。在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;类可以视为创建对象的模板或蓝图&#xff0c; Scanner 类属于 jav…

【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别

目录&#xff1a; 目录 目录&#xff1a; 一、Socket原理与TCP/IP协议 1.1 Socket概念&#xff1a; 1.2 建立Socket连接&#xff1a; 1.3 SOCKET连接与TCP/IP连接 二、HTTP连接&#xff1a; 2.1 HTTP原理 三、三者的区别和联系 前些天发现了一个巨牛的人工智能学习网站&#xf…

markdown 文件渲染工具推荐 obsidian publish

背景 Markdown 是一种轻量级的标记语言&#xff0c;最开始使用它是觉得码字非常方便&#xff0c;从一开始的 word 排版到 markdown &#xff0c;还不太不习惯&#xff0c;用了 obsidian把一些文字发在网上后&#xff0c;才逐渐发现他的厉害之处。 让人更加专注于内容本身&…

转行java浅谈就业前景

Java市场环境 国内的一线、二线和三线城市都有着不同的就业环境&#xff1a; 一线城市&#xff08;如北京、上海、广州、深圳&#xff09;&#xff1a; 一线城市通常拥有最多的高科技公司和互联网企业总部&#xff0c;因此在这些城市&#xff0c;Java开发者通常有更多的就业…

[leetcode]字符串消除连续出现3次及以上的字符

#include <iostream> #include <string> using namespace std;void del(string &s) {int i0,j0;while(i<s.size()){ji;while(j<s.size() && s[j]s[i]){j;}if(j-i>3){s.erase(i,j-i);//消除重复的i0;}elsei;} }

C语言 浮点数 打印的方法

一、方式1 在C语言中&#xff0c;浮点数&#xff08;通常包括 float 和 double 类型&#xff09;的打印是通过标准库中的 printf 函数完成的。为了正确地打印浮点数&#xff0c;需要使用格式说明符来指定如何格式化输出。 #include <stdio.h> int main(void) { floa…

体量小但增速快,国内OTA平台与国际巨头差在哪?

5月3日&#xff0c;Booking、Expedia等国际OTA平台相继发布2024年第一季度财报。5月21日&#xff0c;携程发布2024年第一季度财报。至此&#xff0c;国内外主要OTA平台一季度成绩单均已披露。 受益于全球旅游市场复苏&#xff0c;三家OTA平台一季度营收同比均正向增长。增长之…

03-ArcGIS For JavaScript结合ThreeJS功能

ArcGIS For JavaScript结合ThreeJS功能 概述three.js中功能实现externalRenderers&#xff08;4.28及以下版本&#xff09;RenderNode&#xff08;4.29版本&#xff09; 概述 ArcGIS For Javacript提供了一些对象可以支持加载webgl上下文信息&#xff0c;这里包括webgl编程的代…

基于jeecgboot-vue3的Flowable增加流程支持组件与element-plus组件导入支持

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、package.json文件需要增加相关流程组件&#xff0c;如下 "dependencies": {"element-plus/icons-vue": "^2.3.1","highlightjs/vue-plugin":…

蔬菜水果店做配送分销小程序的作用是什么

蔬菜水果是人们生活必需&#xff0c;传统为线下市场、超市、路边小摊等场景购买&#xff0c;如今快节奏时代&#xff0c;用户需要更快完成消费、商家也需要摆脱竞争获客转化以及提升自己的运营能力。 蔬菜水果隔三岔五或每天都会购买&#xff0c;老客粘性较高&#xff0c;还需…

文字生成图像内容解决方案,享受创作的乐趣

企业对于内容创新和视觉呈现的需求日益增强&#xff0c;美摄科技凭借其卓越的技术实力&#xff0c;推出了一款面向企业的文字生成图像内容解决方案。通过该方案&#xff0c;企业能够轻松将文字内容转化为高质量的图像&#xff0c;实现内容创作的全新突破。 一、车机语音交互&a…

【漏洞复现】懒人网址导航页 search.html SQL注入漏洞

0x01 产品简介 赖人网址导航系统是一种智能化的网址导航平台&#xff0c;旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能&#xff0c;能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时&#xff0c;系统还提供了网址分类、网址收藏和网…

Java-----Stream

前言: Stream流是Java 8引入的功能&#xff0c;用于高效处理数据集合。它提供了丰富的操作方法&#xff0c;如过滤、映射、排序等&#xff0c;以简洁的方式处理数据。Stream流具有流式操作、懒执行和内部迭代的特点&#xff0c;能够简化代码并提高可读性。在接下来的文章中&am…