Unix/Linux 编程實踐教程 ## 什麼是系統編程
系统资源 处理器 程序由指令构成,处理器是执行指令的硬件设备,一个系统中可能有多个处理器,内核可以安排一个程序何时开始开始执行,暂时停止,恢复执行,终止执行
输入输出 程序中所有的输入输出都必须流经内核,集中处理,保证了系统的正确性,安全性,有效性
进程管理 每个程序执行都必须有自己的资源,内核可以新建进程,中止进程,进程调度
内存 程序必须被装载到内存中才能运行,内核可以对进程进行管理,在程序需要的时候给程序分配内存,当程序不需要时,回收内存,还可以保证内存不被其他进程非法访问.
设备 各种设备的操作方式不相同,通过内核,可以屏蔽這種差异, …
线性表(每个线性表上的数据最多只有前和后两个方向):数组,链表,队列,栈 非线性表(数据之间并不是简单的前后关系):二叉树,堆,图
数组的概念 数组( Array )是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
数组的特点 连续的内存空间和相同类型的数据
数组的优点 随机访问:利用寻址公式对元素进行访问:
a[i]_address = base_address + i * data_type_size
数组的查找操作时间复杂度不是O(1),即便是排好的数组,用二分查找,时间复杂度也是O(logn);正确的说法
数组支持随机访问,根据下标随机访问的时间复杂度为O(1)
数组的缺点 低效的插入和删除
插 …
单链表 data.next-->data.next-->NULL
时间复杂度 插入节点:
时间复杂度:O1
删除节点
时间复杂度:O1
查找节点
时间复杂度:O(n)
链表想要随机访问第K个元素arr[k],需要根据指针一个一个找
双向链表 -->prev.data.next<==>prev.data.next<==>prev.data.next 即支持两个方向,每个节点不知有一个后继指针next,还有一个前驱指针prev指向前面的结点
空间复杂度 双向链表需要额外的两个空间来存储后继结点和其前驱结点的地址.所以,如果存储同样多的数据,双向链表要比单链表占用更多的内存空间.虽然两个指针比较浪 …
CleanCode读书笔记 最小惊异原则 1.从一而终,便于修改 2.遵守大家的约定 有意义的命名 1.名副其实 1.命名需要注释来补充,那就不算名副其实 2.在命名时尽量采用有意义的名称,代码的简洁不会改变(运算符和常量的数量,嵌套数量) 2.避免误导 1.避免使用与本意相驳的词 2.提防使用不同之处较小的词 3.不要使用小写l和大写O作为变量名 4.命名有区分,应当有明显的区分,应使读者可以鉴别 3.使用读得出来的名称 4.使用可搜索的名称 1.长名称胜于短名称,搜得到的名称胜于自造的名称 2.单字母仅用于短方法中的本地变量 3.名称长短应与其作用域大小相对应 4.若变量或常量可能在代码中多次使用,则应赋予其便于搜索的名称 5. …