首页 > 编程语言 >算法基础 Introduction

算法基础 Introduction

时间:2022-10-27 20:46:47浏览次数:56  
标签:存储 Introduction 基础 pos -- 算法 数据 结构

算法要求

  • 正确性(Correctness)

    • 语法正确

    • 输入输出(IO)正确

  • 可读性(Readability)

    • 使用注释(不注释比坏注释好,代码易读比过多注释好)

    • 命名契合(camelCase、PascalCase、UnderScoreCase)

  • 健壮性(Robustness)

    • 完善的异常处理(处理非法输入而非处理异常)
  • 高效性(Efficiency)

    • 时间复杂度 $$T(n) = O(f(n))$$
    • 空间复杂度 $$S(n) = O(f(n))$$

抽象数据类型

抽象数据类型概述抽象数据类型(Abstract Data Type, ADT)是软件构造过程中的一个重要实例,与传统的数据类型不同的是,抽象强调作用于数据上的操作,程序员和用户无需关心数据是如何存储的,只需要设计和使用该数据类型即可。

特性:抽象封装(class是ADT的实现)

ADT = (D, S, P)
数据元素的集合、数据元素的关系、数据元素集合的操作

class Student
{
	string studentID;
    string name;
    string gender;
    int age;
    float score;
}
studentId name gender age score
0001 Alice female 18 98
1358 Bob male 20 47
8465 Carol female 16 68
2358 Ted male 17 84

逻辑结构

数据结构的抽象表现

  • 线性

    graph LR A-->B-->C-->D-->E
  • 树形

    graph LR A-->B-->D B-->E B-->G D-->F A-->C C-->H
  • 图状

    graph LR A-->B C-->B A-->C E-->C

物理结构

逻辑结构在计算机中的实现,用存储结构来描述

  • 顺序存储结构(内存空间连续)

    • 物理位置相邻
  • 链式存储结构(内存空间不连续)

    • 使用Node结构

      struct Node
      {
          some_type value;
          Node *next;
      }
      

\[\begin{align*} 存储密度=\frac{数据本身存储量}{结构存储总量} \end{align*} \]

结构的选择

线性结构如 array(数组) 等不应进行很多插入删除操作,但支持随机访问,有着较快的访问速度和较小的空间需求
链式结构如 list(链表) 插入删除快,但需要更多存储空间

一般来说,作为数据集合的逻辑结构通常有如下操作

template<typename T, unsigned N>
class A
{
    T value[N];
    typedef size_t pos;
 public:
    T get(pos); // 访问数据
    T set(T, pos); // 更新数据

    void insert(T); // 插入数据
    void remove(pos); // 删除数据
    pos search(T); // 查找数据

    void sort(bool (*)(T, T)); // 排序
}; // 以上属性(attr)及方法(func)仅作示例
结构与算法
graph LR A(逻辑结构)---B(算法) B---C(存储结构) C---A

即使逻辑结构相同,但实现方法不同(即存储结构不同)各种相关的算法也会不同。
如:线性结构的线性表用冒泡排序作排序算法;链式结构的线性表用插入排序作排序算法。

同样的逻辑结构和存储结构也会因为目的不同采用不同的算法
若算法 F1 有 \(T_{F_1}(n) = C_1n^2\) 但系数 \(C_1\) 较小,算法 F2 有 $$T_{F_2}(n) = C_2log_2n$$ 但系数 \(C_2\) 较大。则有可能在数据量较小时选择 F1,在数据量较大时选用 F2。

标签:存储,Introduction,基础,pos,--,算法,数据,结构
From: https://www.cnblogs.com/violeshnv/p/16833437.html

相关文章

  • 微信小程序的基础配置
    在小程序中的前台、后台:用户当前页面运行或者操作小程序时称为前台,当用户点击左上角关闭或者离开微信时,小程序进入后台。销毁:小程序进入后台一定的时间或者系统资源占用过高......
  • 移动前端viewport的基础概念
    在PC端,视口指的是浏览器的可视区域,其宽度和浏览器的宽度一致,在css标准文档中,视口是所有CSS百分比宽度计算基础,为CSS布局限制了一个最大的宽度。viewport在移动端是一个很重......
  • 反证法证明, 抓住定义的意义,不惧Corner case, 抓住循环不变量 | 代码随想录算法训练
    目录977.有序数组的平方算法的正确性采用反证法证明思路解题方法Code209.长度最小的子数组思维打开,抓住滑动窗口定义本质与意义,笑对CornerCases59.螺旋矩阵II......
  • HTML5 Canvas基础概念(一)
    Canvas基础知识:Canvas属于行内元素,使用Canvas绘制图形步骤:1、获取Canvas对象2、获取上下文环境对象context。3、开始绘制图形在Canvas对象中常用属性属性说明widthCanvas的......
  • 力扣(leetcode) 83. 删除排序链表中的重复元素(双指针算法)
    题目在这​​:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/​​思路分析:删除链表中相同的元素嘛。要注意这个链表是升序链表哦~~~~我们建立三......
  • 数据结构与算法---二分法 超详细解,保证你能看懂!!!!!
    二分法不难,看完这篇文章,你必懂。假如我们遇到了一道算法题,要求我们从数组A=[a,b,c,d,e]里找到d,那通常我们会逐个遍历,遍历a,b,c,d一共需要对比4个数字才能找到d。那如果使用......
  • 力扣(leetcode) 28. 实现 strStr() (一行代码解决问题) KMP算法解法待更新!!!!!!
    题目在这:https://leetcode-cn.com/problems/implement-strstr/法一:思路分析:Pythonfind()方法:检测字符串中是否包含子字符串str,如果指定beg(开始)和end(结束)范围,则......
  • python基础:hashilib加密模块
    目录hashilib加密模块1加密的含义简介2加密算法基本操作3加密补充说明(hashlib的特点)4加密操作的用处5优秀hash算法的特性hashilib加密模块hashlib是一个提供了......
  • python基础:subprocess子进程模块
    子进程模块subprocess模块模拟操作系统,执行命令并获取结果subprocess模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。importsubproce......
  • python基础:logging日志模块
    目录logging日志模块1.如何理解日志2.日志的级别3日志的组成4日志配置字典logging日志模块1.如何理解日志​简单的理解为记录数据行为的文件。​......