HeZephyr

HeZephyr's Blog

日拱一卒无有尽,功不唐捐终入海

HeZephyr's GitHub chart

数据结构与算法 面试题目总结

1 排序算法

排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性算法基本思路
冒泡排序$$O(n^2)$$$$O(n^2)$$$$O(1)$$稳定反复交换相邻逆序的元素,直到没有逆序对
选择排序$$O(n^2)$$$$O(n^2)$$$$O(1)$$数组不稳定、链表稳定反复选择未排序部分中的最小(大)元素,放在已排序部分的末尾
插入排序$$O(n^2)$$$$O(n^2)$$$$O(1)$$稳定逐一选择未排序元素,将其插入到已排序部分的正确位置
快速排序$$O(n \log_2 n)$$$$O(n^2)$$$$O(\log_2 n)$$不稳定选择基准,将数组分为小于和大于基准的两部分,递归排序
堆排序$$O(n \log_2 n)$$$$O(n \log_2 n)$$$$O(1)$$不稳定构建最大(小)堆,将堆顶元素与末尾元素交换,调整堆
归并排序$$O(n \log_2 n)$$$$O(n \log_2 n)$$$$O(n)$$稳定递归地将数组分为两部分,分别排序后合并
希尔排序$$O(n \log_2 n)$$$$O(n^2)$$$$O(1)$$不稳定分组进行插入排序,逐渐减少间隔,直到间隔为1
计数排序$$O(n + m)$$$$O(n + m)$$$$O(n + m)$$稳定统计每个元素的出现次数,根据计数对元素进行排序
桶排序$$O(n)$$$$O(n)$$$$O(m)$$稳定将元素分配到不同的桶中,分别排序后合并
基数排序$$O(k \cdot n)$$$$O(n^2)$$取决于实现稳定逐位排序,从最低有效位到最高有效位进行

2 栈与队列的区别

  • 队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;
  • 栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。
  • 队列先进先出,栈先进后出。
  • 栈只能在表尾插入删除,队列在表尾插入表头删除。
  • 应用场景不同:
    • 栈:括号问题的求解等
    • 队列:计算机系统中各种资源的管理等。
  • 遍历速度不同:
    • 队列:基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快;
    • 栈:只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。

3 两个栈实现一个队列

使用两个栈来实现一个队列,可以有效地利用栈的特性(后进先出)来模拟队列的特性(先进先出)。我们可以使用两个栈来分离入队和出队操作,具体实现步骤如下:

C/C++ 面试题目总结

  1. const知道吗?解释其作用

    1. 修饰变量,说明该变量不可以被改变;
    2. 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
    3. 修饰引用,指向常量的引用(reference to const),用于形参类型,既避免了拷贝,又避免了函数对值的修改;
    4. 修饰成员函数,说明该成员函数内不能修改成员变量。
  2. 宏定义 #define 和 const 常量

【MIT 6.5840(6.824)学习笔记】 测试分布式系统的线性一致性

Testing Distributed Systems for Linearizability 原文

1 引言

正确实现一个分布式系统是非常有挑战的一件事情,因为需要很好的处理并发和失败这些问题。网络包可能被延迟,重复,乱序或者丢弃,机器可能在任何时候宕机。即使一些计被论文证明是正确的,也仍然很难再实现中避免 bug。

【MIT 6.5840(6.824)学习笔记】使用Go进行线程和RPC编程

1 为什么选择Go

在实现分布式系统时,选择合适的编程语言非常重要。Go有以下特点:

  • 优秀的线程支持;
  • 便捷的RPC机制、类型;
  • 内存安全以及垃圾回收机制。

这使Go成为了一个理想的选择。Go不仅相对简单,而且其垃圾回收机制使线程管理更加容易,避免了使用后释放问题。由于这些优势,Go在分布式系统中被广泛应用。

【MIT 6.5840(6.824)】Lab1:MapReduce 设计实现

1 介绍

本次实验是实现一个简易版本的MapReduce,你需要实现一个工作程序(worker process)和一个调度程序(coordinator process)。工作程序用来调用Map和Reduce函数,并处理文件的读取和写入。调度程序用来协调工作任务并处理失败的任务。你将构建出跟 MapReduce论文 里描述的类似的东西。(注意:本实验中用"coordinator"替代里论文中的"master"。)

【MIT 6.5840(6.824)学习笔记】 分布式系统介绍

1 概念

当我们谈论分布式系统时,我们指的是一组通过网络连接的计算机,它们协同工作以完成某种共同的任务或目标。

在分布式系统中,通信是通过消息传递进行的。这意味着各个计算节点之间通过发送和接收消息来进行通信,而不是通过共享内存。这种消息传递模型使得分布式系统的设计和实现更为灵活,因为每个节点可以独立地运行,并通过消息传递来进行协作。

0%