《算法导论》总结与分析

2023-11-13

分治

strassen算法

介绍

  • 用于方阵求乘积。

步骤

  • 将方阵分块后,得到8个子方阵;
  • 计算10个S矩阵;

S 1 = B 12 − B 22 S 2 = A 11 + A 12 S 3 = A 21 + A 22 S 4 = B 21 − B 11 S 5 = A 11 + A 22 S 6 = B 11 + B 22 S 7 = A 12 − A 22 S 8 = B 21 + B 22 S 9 = A 11 − A 21 S 10 = B 11 + B 12 \begin{aligned} &S_{1}=B_{12}-B_{22}\\ &S_{2}=A_{11}+A_{12}\\ &S_{3}=A_{21}+A_{22}\\ &S_{4}=B_{21}-B_{11}\\ &S_{5}=A_{11}+A_{22}\\ &S_{6}=B_{11}+B_{22}\\ &S_{7}=A_{12}-A_{22}\\ &S_{8}=B_{21}+B_{22}\\ &S_{9}=A_{11}-A_{21}\\ &S_{10}=B_{11}+B_{12} \end{aligned} S1=B12B22S2=A11+A12S3=A21+A22S4=B21B11S5=A11+A22S6=B11+B22S7=A12A22S8=B21+B22S9=A11A21S10=B11+B12

  • 通过8个子方阵和10个S矩阵做7次矩阵乘法,得到7个P方阵;

P 1 = A 11 ∙ S 1 P 2 = S 2 ∙ B 22 P 3 = S 3 ∙ B 11 P 4 = A 22 ∙ S 4 P 5 = S 5 ∙ S 6 P 6 = S 7 ∙ S 8 P 7 = S 9 ∙ S 10 \begin{aligned} &P_1=A_{11}\bullet S_{1}\\ &P_2=S_{2}\bullet B_{22}\\ &P_3=S_{3}\bullet B_{11}\\ &P_4=A_{22}\bullet S_{4}\\ &P_5=S_{5}\bullet S_{6}\\ &P_6=S_{7}\bullet S_{8}\\ &P_7=S_{9}\bullet S_{10} \end{aligned} P1=A11S1P2=S2B22P3=S3B11P4=A22S4P5=S5S6P6=S7S8P7=S9S10

  • 根据计算得到的P方阵组合求方阵乘积。

C 11 = P 5 + P 4 − P 2 + P 6 C 12 = P 1 + P 2 C 21 = P 3 + P 4 C 22 = P 5 + P 1 − P 3 − P 7 \begin{aligned} &C_{11}=P_5+P_4-P_2+P_6\\ &C_{12}=P_1+P_2\\ &C_{21}=P_3+P_4\\ &C_{22}=P_5+P_1-P_3-P_7 \end{aligned} C11=P5+P4P2+P6C12=P1+P2C21=P3+P4C22=P5+P1P3P7

正确性证明

  • P 1 ⋯ P 7 P_1\cdots P_7 P1P7展开带入最后公式。

复杂度分析

  • 朴素算法求方阵乘积的时间复杂度是 O ( n 3 ) O(n^3) O(n3)
  • 方阵分块乘积时,若维度是2的倍数,可将每个方阵分为4个小方阵求乘积。

C 11 = A 11 ∙ B 11 + A 12 ∙ B 21 C 12 = A 11 ∙ B 12 + A 12 ∙ B 22 C 21 = A 21 ∙ B 11 + A 22 ∙ B 21 C 22 = A 21 ∙ B 12 + A 22 ∙ B 22 C_{11}=A_{11}\bullet B_{11}+A_{12}\bullet B_{21}\\ C_{12}=A_{11}\bullet B_{12}+A_{12}\bullet B_{22}\\ C_{21}=A_{21}\bullet B_{11}+A_{22}\bullet B_{21}\\ C_{22}=A_{21}\bullet B_{12}+A_{22}\bullet B_{22} C11=A11B11+A12B21C12=A11B12+A12B22C21=A21B11+A22B21C22=A21B12+A22B22

  • 得到时间复杂度公式如下

T ( n ) = { O ( 1 ) n = 1 8 T ( n / 2 ) + O ( n 2 ) n > 1 T(n)= \left\{ \begin{aligned} &O(1) &n=1\\ &8T(n/2)+O(n^2) & n>1 \end{aligned} \right. T(n)={O(1)8T(n/2)+O(n2)n=1n>1

  • 推导出方阵分块求乘积时间复杂度为 O 3 O^3 O3

  • strassen算法的时间复杂度在方阵分块的基础上将子方阵的乘法次数缩减为7。

T ( n ) = { O ( 1 ) n = 1 7 T ( n / 2 ) + O ( n 2 ) n > 1 T(n)= \left\{ \begin{aligned} &O(1) & n=1\\ &7T(n/2)+O(n^2) & n>1 \end{aligned} \right. T(n)={O(1)7T(n/2)+O(n2)n=1n>1

  • 推导出strassen算法求乘积时间复杂度为 O l g 7 O^{lg7} Olg7

排序

堆排序

介绍

  • 利用完全二叉树(数组表示)特性构造堆。

步骤

构建

  • DownAdjust(begin, end)将子树构建为堆。
//从begin_index到end_index向下调整堆
void Heap::DownAdjust(const int begin_index, const int end_index) {
    //end_index超过堆大小则退出
	assert(end_index <= tail_index_);

    //father表示起始节点,child表示father对应的子节点
	int father = begin_index, child = father * 2;
	while (child <= end_index) {
        //JudgeForOrder根据最大(小)堆特性来判断
        //child选择更大(小)的子节点
		if (child != end_index && JudgeForOrder(heap_[child + 1], heap_[child])) {
			++child;
		}

        //child和father比较
		if (JudgeForOrder(heap_[father], heap_[child]))
			break;
        //若child比father大(小)则交换节点值并迭代调整
		std::swap(heap_[child], heap_[father]);
		father = child;
		child = child * 2;
	}
}
  • MakeHeap()调整每一个非叶子节点,完成建堆。
void Heap::MakeHeap() {
    //从最后一个非叶子节点开始向前迭代
	for (int i = heap_.size() / 2; i >= 1; --i) {
        //调整以i为根节点的子堆
		DownAdjust(i, tail_index_);
	}
}

排序

  • 根据堆的特性,通过每次将堆顶元素放到未排序堆尾并调整剩余堆,可将(大顶堆->降序)、(小顶堆->升序)。
void Heap::Sort() {
    //保证堆是最大(小)堆
	MakeHeap();

    //从堆尾开始向前迭代
	for (int i = tail_index_; i > 1; --i) {
        //i之后的元素为已经排好序的元素
        //每次将i节点元素与堆顶元素交换->打乱堆秩序
		std::swap(heap_[i], heap_[1]);
        //从堆顶向下调整
		DownAdjust(1, i - 1);
	}
}

优先队列

  • 优先队列本质上是堆,在堆的基础上增加了出队列入队列的操作。
void Heap::Pop() {
    //队列为空不可出队列
	assert(tail_index_ >= 1);

    //将堆尾元素置换到堆顶并缩小队列
    //=>等价于弹出堆顶并打乱堆秩序
	heap_[1] = heap_[tail_index_--];
    //从堆顶向下调整
	DownAdjust(1, tail_index_);
}

void Heap::Push(const int val) {
    //将元素插入到队尾
	if (++tail_index_ < heap_.size()) {
		heap_[tail_index_] = val;
	} else {
		heap_.push_back(val);
	}
    //从堆尾向上调整
	UpAdjust(1, tail_index_);
}
  • UpAdjust(begin, end)将向上调整堆。
//从end_index开始向上调整到begin_index
void Heap::UpAdjust(const int begin_index, const int end_index) {
    //end_index<1时无效
	assert(end_index >= 1);

    //child表示起始节点,father表示child对应的父节点
	int child = end_index, father = child / 2;
	while (father >= begin_index) {
        //child和father比较
		if (JudgeForOrder(heap_[father], heap_[child]))
			break;
        //若child比father大(小)则交换节点值并迭代调整
		std::swap(heap_[child], heap_[father]);
		child = father;
		father = child / 2;
	}
}

复杂度分析

  • 向下调整子堆的时间复杂度公式

T ( n ) ≤ T ( 2 n / 3 ) + O ( 1 ) T(n)\leq T(2n/3)+O(1) T(n)T(2n/3)+O(1)

  • 根据主定理推算出向下调整子堆的时间复杂度为 O ( l g   n ) O(lg\ n) O(lg n)
  • 建堆需要n/2次向下调整子堆(每次子堆高度不同),时间复杂度公式为

∑ k = 0 ⌊ l g   n ⌋ ⌈ n 2 k + 1 ⌉ O ( h ) = O ( n ∑ k = 0 ⌊ l g   n ⌋ h 2 k ) ⇒ O ( n ∑ k = 0 ∞ h 2 k ) = O ( n ) \sum^{\lfloor lg\ n \rfloor}_{k=0}\lceil \frac{n}{2^{k+1}} \rceil O(h)=O(n\sum^{\lfloor lg\ n \rfloor}_{k=0}\frac{h}{2^{k}})\Rightarrow O(n\sum^{\infin}_{k=0}\frac{h}{2^{k}})=O(n) k=0lg n2k+1nO(h)=O(nk=0lg n2kh)O(nk=02kh)=O(n)

  • 推导出建堆的时间复杂度为 O ( n ) O(n) O(n)

  • 堆排序的时间复杂度为 O ( n l g   n ) O(nlg\ n) O(nlg n)

快速排序

介绍

  • 利用分治的方法将大数组排序分为小数组排序。

步骤

  • Partition(…)找到中间元素下标。
    • 若为递增排序,下标左边元素<=中间元素<=下标右边元素;
    • 若为递减排序,下标左边元素>=中间元素>=下标右边元素。
//对任何支持比较运算符的类型兼容
//从start_index到end_index查找
//is_random表示是否使用随机元素
template<typename T>
	int Partition(std::vector<T>& origin,
								const int start_index, 
								const int end_index,
								const bool is_random) {
    	//找范围内随机下标元素置换到末元素
		if (is_random) {
			decltype(uniform)::param_type param{ start_index, end_index };
			uniform.param(param);
			std::swap(origin[uniform(gen)], origin[end_index]);
		}

    	//末元素的值作为中间值
		T mid_value = origin[end_index];
    	//index表示比中间值小的最后一个位置
		int index = start_index - 1;
    	//从start_index到end_index前一个
    	//将比中间值小(大)的元素放到左边
		for (int i = start_index; i < end_index; ++i) {
			if (JudgeForOrder(mid_value, origin[i])) {
				std::swap(origin[i], origin[++index]);
			}
		}
    	//将末元素换到划分数组位置
		std::swap(origin[end_index], origin[++index]);
    	//返回划分数组位置
		return index;
	}
  • Sort(…)递归地调整小数组。
//对任何支持比较运算符的类型兼容
//从start_index到end_index排序
//is_random表示是否使用随机元素
template<typename T>
	void Sort(std::vector<T>& origin,
						const int start_index, 
						const int end_index,
						const bool is_random) {
    	//临界值,表示不需要排序(无内容)
		if (start_index >= end_index)
			return;

    	//获取中间分割点
		int privot = Partition(origin, start_index, end_index, is_random);
    	//递归排序左数组
		Sort(origin, start_index, privot - 1, is_random);
    	//递归排序右数组
		Sort(origin, privot + 1, end_index, is_random);
	}

复杂度分析

  • Partition在子数组上只需要一次遍历,故时间复杂度为 O ( n ) O(n) O(n)

最坏情况

  • 划分时选定的坐标总是为范围内最大(小)值,导致小数组被划分为n-1和1,该种情况下时间复杂度公式为

T ( n ) = T ( n − 1 ) + O ( n ) T(n)=T(n-1)+O(n) T(n)=T(n1)+O(n)

  • 得到时间复杂度为 O ( n 2 ) O(n^2) O(n2)

最好情况

  • 划分时恰好为数组中间位置,数组被划分为n/2和n/2,时间复杂度公式为

T ( n ) = 2 T ( n / 2 ) + O ( n ) T(n)=2T(n/2)+O(n) T(n)=2T(n/2)+O(n)

  • 得到时间复杂度为 O ( n l g   n ) O(nlg\ n) O(nlg n)

平衡情况下与最好情况类似

线性时间排序

介绍

  • 利用格外存储空间排序。

步骤

计数排序

  • 在数轴上记录每个数点的出现次数,累加后得到当前数点排序后的位置,插入数组。

桶排序

  • 将均匀分布的数放到桶数组中,每个桶是一个列表,插入列表时按照大小排序,最后汇总。

复杂度分析

  • 都是 O ( n ) O(n) O(n)

数据结构

二叉搜索树

介绍

  • 若存在左子树或右子树,保证 V l e f t ≤ V r o o t ≤ V r i g h t V_{left}\leq V_{root}\leq V_{right} VleftVrootVright(或者 V l e f t ≥ V r o o t ≥ V r i g h t V_{left}\geq V_{root}\geq V_{right} VleftVrootVright)。

复杂度分析

  • 所有操作都是 O ( n ) O(n) O(n)
    • 因为查询操作时间复杂度为 O ( n ) O(n) O(n),其他操作是基于查询的。
  • 查询时间复杂度推导使用归纳法

T ( 0 ) = c T ( n ) ≤ T ( k ) + T ( n − k − 1 ) + d = ( ( c + d ) k + c ) + ( ( c + d ) ( n − k − 1 ) + c ) + d = ( c + d ) n + c \begin{aligned} T(0)&=c&\\ T(n)&\leq T(k)+T(n-k-1)+d&\\ &=((c+d)k+c)+((c+d)(n-k-1)+c)+d&\\ &=(c+d)n+c& \end{aligned} T(0)T(n)=cT(k)+T(nk1)+d=((c+d)k+c)+((c+d)(nk1)+c)+d=(c+d)n+c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《算法导论》总结与分析 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • python爬虫五:beautifulsoup4的安装使用

    1 bs4简介 概念 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库 安装 先安装它的依赖模块 lxml 再安装 bs4 pip install lxml gt pip install bs4 最基
  • 32万记录导入MSSQL,只需12.52秒,足足快了200多倍,省了一个小时干啥不好吗?

    现在云时代 大家都用上云了 现在云的带宽5M都觉得很大了 但是有大量的数据需要处理的话 按照传统的方式 上传一个32万记录的DBF 起码也得一个小时 而现在有款工具 来自ZHZ 可以节省你200多倍的时间 香不香 测试环境 win7 32位
  • Android Rxjava:最简单易懂的诠释 看这篇

    1 前言 Rxjava 具有链式调用 使用简单 事件与结果松耦合的特点 Rxjava 之所以深受欢迎它包含 非常多操作符 能通过 链式形 优雅整洁的代码几乎能实现所有的功能需求 本文特点 图多字少 逻辑简单 之前面试中被问了很多Rxjava
  • 激活函数(sigmoid、tanh、ReLU、softmax)

    文章目录 1 1 sigmoid函数 1 2 tanh函数 1 3 ReLU函数 1 4 softmax函数 激活函数在神经网络中的作用有很多 主要作用是给神经网络提供非线性建模能力 如果没有激活函数 那么再多层的神经网络也只能处理线性可分
  • 在阿里工作的日子里,我都学到了哪些东西?

    来阿里也有段时间了 这段时间学了很多东西 简单说起来 就是一个走出舒适区的过程 从一开始的新手入门 到逐渐熟悉业务和技术 再到慢慢的适应环境 胜任工作 总体来说 这几个月还是学到了很多东西 感觉成长的很快 但同时工作的压力也非常的大 总体来
  • 【翻译 + 整理】Qt样式表详解(2):属性——背景相关属性

    1 alternate background color 交替背景色 用于QAbstractItemView的子类 QColumnView QHeaderView QListView QTableView QTreeView 使用的前提是开
  • Zabbix监控部署项目

    为什么选择Zabbix Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix 能监视各种网络参数 保证服务器系统的安全运营 并提供灵活的通知机制以让系统管理员快速定位 解决存在的各种
  • Springboot配置端口号

    springboot项目端口配置可以通过application yml或application properties指定 server port 80 或者 server port 8089 代码指定 springboot2 x以上版本Em
  • 关于AI自动写作的资料

    AI 自动写作 产品调研 第一种是AI新闻时事类写作 核心场景是在内容平台通过人 机混编的方式 机器帮助编辑 内容创作者 减少重复劳动 提高生产效率 主要调研了今日头条的xiaomingbot 腾讯的Dreamwriter 百度的writi
  • iOS架构师_消息转发机制

    1 动态方法解析 对象在收到无法处理的消息时 会调用下面的方法 前者是调用类方法时会调用 后者是调用对象方法时会调用 未实现类方法调用 BOOL resolveClassMethod SEL sel 未实现实例方法调用 BOOL resol
  • osg学习(七十)如何根据视口对象自动调整视点位置、距离

    osgGA CameraManipulator cpp void CameraManipulator computeHomePosition const osg Camera camera bool useBoundingBox doubl
  • Unity的2D图集处理,并切割出一张张小图片

    转载请注明出处 http blog csdn net hongyouwei article details 45011315 在我们找资源的时候 有时候会遇到那种把一堆图片放进一张png图片里面的情况 在做2D游戏的时候 我们往往需要将里面
  • jackson自定义全局序列化、反序列化

    需要自定义Jackson序列化和反序列化有两种方式 一种是全局定义 一种是非全局定义 先来看看全局定义 全局定义的步骤如下 以定义一个localDateTime的序列化和反序列化为例 一 创建序列化类 创建一个序列化类然后继承JsonSer
  • 基于JavaWeb(JSP+Servlet+MySQL)编程实现员工信息的添加、修改、删除、列表显示。

    1 项目结构 2 页面主要代码 2 1员工添加页面代码以及效果图 add jsp 员工添加
  • linux 修改用户密码的几种方法

    1 passwd 命令 手动修改 root localhost testuser passwd testuser Changing password for user testuser New password Retype new pas
  • Spring Factories

    该文章转载自 https blog csdn net lvoyee article details 82017057 Spring Boot中有一种非常解耦的扩展机制 Spring Factories 这种扩展机制实际上是仿照Java中的S
  • 简说数据库事务的ACID

    事务是应用程序中一系列严密的操作 所有操作必须成功完成 否则在每个操作中所作的所有更改都会被撤消 也就是事务具有原子性 一个事务中的一系列的操作要么全部成功 要么一个都不做 原子性 Atomicity 一致性 Consistency 隔离性
  • postman 模拟请求中添加 header,post请求中传json参数

    1 GET 请求 2 Post 请求 请求参数为Json header中带有参数 问题延伸 GET请求不能够 添加 Body 吗 答案 转载于 https www cnblogs com zacky31 p 8808110 html
  • 【网络安全】——区块链安全和共识机制

    区块链安全和共识机制 摘要 区块链技术作为一种分布式去中心化的技术 在无需第三方的情况下 使得未建立信任的交易双方可以达成交易 因此 区块链技术近年来也在金融 医疗 能源等多个行业得到了快速发展 然而 区块链为无信任的网络提供保障的同时 也
  • 《算法导论》总结与分析

    算法导论总结与分析 分治 strassen算法 介绍 步骤 正确性证明 复杂度分析 排序 堆排序 介绍 步骤 构建 排序 优先队列 复杂度分析 快速排序 介绍 步骤 复杂度分析 最坏情况 最好情况 线性时间排序 介绍 步骤 复杂度分析 数据