高级算法日记4:查找与排序

《DOOR II》数字日记:从碎片记录到非线性叙事的交互设计实践 数字日记系统通过整合时空数据与用户生成内容,构建个人记忆的可视化容器。其技术原理结合自动化采集与语义标签,利用地图隐喻实现非线性叙事结构,有效解决信息过载时代的记录与回顾难题。在工程实践中,这类工具需平衡数据采集的自动化程度与用户输入负担,通过渐进式交互设计降低使用门槛。以《DOOR II》为代表的实验性项目,将城市探索与个人记忆数字化,为开发者提供了跨平台技术栈选型与分阶段实施的参考范式,特别适合处理碎片化记录与连续性叙事的平衡问题。 阅读详情

作者:孙相国

E-mail: sunxiangguodut@qq.com

版权所有,严禁转载

1. 查找

1.1 顺序查找

弱智,不讲

成功情况下,平均查找长度:

ASLsuc=1nn(n+1)2=n+12

时间复杂度: O(n)

不成功的情况下(即找的数不在表中),平均查找长度

ASLfail=n

1.2 折半查找

def bi_search(R,k):
  low,high=0,len(R)
  while low<=high:
    mid=(low+high)/2
    #mid=low+(high-low)/2
    if R[mid]==k:
      return mid
    if R[mid]>k:
      high=mid-1
    else:
      low=mid+1
  return -1

思考题:如何计算ASL?

判定树(page379)

ASLsuc=∑i=1npici=1n∑i=1h2i−1×i=n+1nlg(n+1)−1=lg(n+1)−1

时间复杂度为 O(lgn)

不成功的查找长度为h,即 lg(n+1)

1.3 分块查找

![这里写图片描述](https://img-blog.youkuaiyun.com/20170825154849018?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2l0aHViXzM2MzI2OTU1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

若以折半查找索引表,以顺序查找块表,则

ASL=lg(n/s+1)+s2

若以顺序查找查找索引表和块表则
ASL=b+12+s+12=s2+2s+n2s

当 s=n12 时,可以取到极小 n12+1 .

上述3中查找方法的比较:

就平均查找长度而言,折半查找最小,分块次之,顺序最长

就表的结构而言,顺序查找对有序表无序表均适用,折半查找仅仅适用于有序表,分块查找要求表中元素至少是分块有序的。

就表的存储结构而言,顺序查找和分块查找可以用于顺序表和链表;而折半查找只用于顺序表

分块查找综合了顺序表和折半查找的优点。(既能较快地查找,又能适应动态变化的要求)

1.4 二叉排序树

1.4.1二叉排序树(BST)

  • 若它左子树非空,则左子树上所有记录均小于根记录
  • 若它右子树非空,则右子树上所有记录均大于根记录
  • 左右子树本身又是一棵二叉排序树

1.4.2二叉排序树的性质

  • 按照中序遍历得到的中序序列是一个递增有序序列
  • 一棵二叉排序树中的最大节点是根节点的最右下节点,最小节点是根节点的最左下节点
  • 只需给出一棵二叉排序树的先序序列/后序序列/层次序列中的一个,便可以唯一确定这棵二叉排序树,因为这些序列中所有元素的递增序列便是该二叉排序树的中序序列。

1.4.3 二叉排序树的查找

def search(root,key):
  if key==root:
    return root
  elif key<root:
    search(root.left_child,key)
  elif key>root:
    search(root.right_child,key)
  else:
    return none

一棵含有n个节点的二叉排序树高度为lgn-n

这也是查找所需要的时间复杂度

1.4.4 二叉排序树的插入

def insert(root,k):
  if root is none:
    root=k
  elif root>k:
    return insert(root.left_child,k)
  else:
    return insert(root.right_child,k)

1.4.5 二叉排序树的删除

这里写图片描述
这里写图片描述

这里写图片描述

二叉排序树的插入和删除操作时间复杂度均为 O(lgn)

1.5 平衡二叉树

1.6 B树

1.7 哈希表查找

2. 排序

2.0 排序前传

各种排序算法的江湖地位:

傻子系列:

直接插入(弱智)

折半插入(自以为漂亮的弱智)

希尔排序(自以为高大上的弱智)

不会你都系列:

冒泡排序(不会你都不好意思思考人生)

计数排序(不会你都不好意思吹牛逼)

基数排序(不会你都不好意思撩妹)

桶排序(不会你都不好意思装大神)

核心系列:

简单选择排序(重要)

堆排序(三大金刚之一,非常重要!)

快速排序 (三大金刚之二,非常重要的平方!!)

归并排序(三大金刚之三,非常重要)

边缘:

外排序(屌丝)

2.1 直接插入

void insert_sort(sqlist R[], int n)
{
    int i,j;
    sqlist temp;
    for (i=1;i<n;i++)
    {
        temp=R[i];
        j=i-1;
        while(j>=0 && temp.key<R[j].key)
        {
            R[j+1]=R[j];
            j--;
        }
        R[j+1]=temp;
    }
}
def insert_sort(r):
  for i in range(0,len(r)):
    pos=i
    while r[pos]>r[i]:
      pos=pos-1
    r[pos:i+1]=r[i]+r[pos:i]

globally sequential

no

time complexity

average: O(n2)

worst: O(n2)

best: O(n)

space complexity

O(1)

stability

stable

2.2 折半插入

void insert_sort(sqlist R[], int n)
{
    int i,j,low,high,mid
    sqlist temp;
    for (i=1;i<n;i++)
    {
        temp=R[i];
        low=0;high=i-1;
        while(low<high)
        {
            mid=(low+high)/2;
            if(temp.key<R[mid].key)
              high=mid-1;
            else
              low=mid+1
        }
        for (j=i-1;j>=high+1;j--)
        {
            R[j+1]=R[j];
        }
        R[high+1]=temp;
    }
}
def insert_sort(r):
  for i in range(0,len(r)):
    low,high=0,i-1
    while low<=high:
      if r[i]<r[mid]:
        high=high+1
      else:
        low=mid+1

    r[high+1:i+1]=r[i]+r[high+1:i]

globally sequential

no

time complexity

average: O(n2)

worst: O(n2)

best: O(n)

space complexity

O(1)

stability

stable

2.3 希尔排序

void shell_sort(sqlist R[], int n)
{
    int i,j,d;
    sqlist temp;
    d=n/2;
    while(d>0)
    {
        for (i=d;i<n;i++)
        {
            temp=R[i];
            j=i-d;
            while(j>=0 &&temp.key<R[j].key)
            {
                R[j+d]=R[j];
                j=j-d;
            }
          R[j+d]=temp;
        }
      d=d/2;
    }
}
def insert_sort(r):
  for i in range(0,len(r)):
    low,high=0,i-1
    while low<=high:
      if r[i]<r[mid]:
        high=high+1
      else:
        low=mid+1

    r[high+1:i+1]=r[i]+r[high+1:i]

def shell_sort(r):
  d=len(r)/2
  while d>0:
    for i in range(0,d):
      insert_sort(r[range(i,len(r),d)])
    d=d/2

globally sequential

no

不考

time complexity

average: O(n1.3)

space complexity

O(1)

stability

unstable

希尔排序的时间复杂度与子排序算法,增量策略,有极大的关系。没有定论

http://blog.youkuaiyun.com/u013630349/article/details/48250109

2.4 简单选择排序

void select_sort(sqlist R[], int n)
{
    int i,j,k;
    sqlist temp;
    for (i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
          if(R[j].key<R[k].key)
            k=j;
        swap(R[i],R[k]);
        /*
        if(i!=k)
        {
          temp=R[i];
          R[i]=R[k];
          R[k]=temp;
        }
        */
    }
}
def select_sort(r):
    for i in range(0,len(r)):
        k=argmin(r[i+1:])
        r[i],r[k]=r[k],r[i]
def select_sort(r):
    for i in range(0,len(r)):
        r[i],r[argmin(r[i+1:])]=r[argmin(r[i+1:])],r[i]

globally sequential

yes

time complexity

average: O(n2)

worst: O(n2)

best: O(n)

space complexity

O(1)

stability

unstable

2.5 堆排序

2.5.1 堆

堆,一般指的是二叉堆,这是一个数组,可以看做一个完全二叉树,如下图所示:

这里写图片描述

二叉堆可以分为两种形式:最大堆和最小堆

最大堆: A[π(i)]⩾A[i]

最小堆: A[π(i)]⩽A[i]

堆排序算法中,默认使用的是最大堆,而最小堆通常用于构造优先队列

复习:n个节点的完全二叉树,高度是: ⌈lg(n+1)⌉ 或 ⌊lgn+1⌋

以后为了方便起见,简称为 Θ(lgn)

需要重点掌握的操作有(达到精通代码的程度):

  • max_heapify: 维护最大堆
  • build_max_heap: 构建最大堆
  • heap_sort:堆排序算法
  • 其他重要的堆操作(用于实现优先队列)有:max_heap_insert; heap_extract_max; heap_increase_key; heap_maxmum

2.5.2 堆的维护

什么叫做堆的维护?(max_heapify)

对于一个二叉堆,假设以root.left和root.right为根的二叉堆分别都是最大堆,但是root这个值却没有校验,即,我们不知道是否以root为根的二叉堆也为一个最大堆。最大堆维护,就是希望将此时的root放到正确的位置,从而使得以root为根的二叉堆也为一个最大堆。

def max_heapify(A,i):
  left=2*i
  right=if 2*i+1>len(A) none else 2*i+1
  """
  method1(sunsum):
  if A[left]>A[i]:
    largest=l
  else:
    largest=i
  if A[right]>A[largest]:
    largest=r

  method2(xiaomi):
  largest=argmax([A[left],A[i],A[right]])
  if largest==0: 
    largest=left
  elif largest==1:
    largest=i
  elif largest==2:
    largest=right

   method3(iPhone):
   """
  largest=[left,i,right]
  largest=largest[argmax([A[left],A[i],A[right]])]

  if largest!=i:
    swap(A[i],A[largest])
    max_heapity(A,largest)

C++代码与上面的代码雷同,略。

def max_heapify(A,current_root):
  largest=max(current_root.left,current_root,current_root.right)
  if largest is not current_root:
    swap(largest,current_root)
    max_heapify(A,largest)

思考题(家庭作业):如何采用非递归的方式实现?

void max_heapify(sqlist R[],int low,int high)
{
  int i=low, j=2*i;
  sqlist temp=R[i];
  while(j<=high)
  {
    if (j<high && R[j]<R[j+1])
      j++;
    if(temp<R[j])
    {
      R[i]=R[j];
      i=j;
      j=2*i;
    }
    else break;
  }
  R[i]=temp;
}

2.5.3 建堆

def build_max_heap(A):
  for i in range(len(A)/2,0,-1):
    max_heapify(A,i)

2.5.4 堆排序

def heap_sort(A):
  for i in range(0,len(A)):
    build_max_heap(A[i:])
    swap(A[i],A[-1])

globally sequential

yes

time complexity

average: O(nlgn)

worst: O(nlgn)

best: O(nlgn)

space complexity

O(1)

stability

unstable

2.5.5 优先队列

优先队列(priority queue) 是一种用来维护一组元素构成的集合S的数据结构,其中每一个元素都有一个key(关键字)。一个最大优先队列支持以下操作:

  • insert(S,x): 把元素x插入集合S中。这一操作等价于 S=S∪x (回顾之前DFS操作中的 T=T∪(u,v) )
  • maximum(S): 返回S中具有最大键字的元素
  • extract_max(S): 去掉并返回S中具有最大键字的元素
  • increase_key(S,x,k): 将元素x的关键字增加到k,这里假设k的值不小于x的原关键字。

优先队列的应用:

1,最大优先队列,用于操作系统中的作业调度。最大优先队列记录将要执行的各个作业以及它们之间的相对优先级。当一个作业完成或者中断后,调度器调用extract_max从所有等待的作业中,选出一个具有最高优先级的作业来执行。在任何时候,调度器都可以调用insert把一个新作业加入到队列中来。

2,最小优先队列,亲爱的,还记得我们之前讲过的最下生成树吗?记不记得那个prim算法的复杂度?里面有一个操作,叫做extract_min()?是的,你没看错,就是这里面的东西。

这部分的代码不需要掌握,了解即可。

用堆来实现优先队列

def heap_maximum(S):
  return S[0]
def heap_extract_max(S):
  max=S[0]
  S[0]=S[-1]
  max_heapity(S,0)
  return max

时间复杂度是 O(lgn)

这就是说,如果采用堆来实现,那么先前我们的prim算法复杂度可以进一步降低为 O(nlgn+e)

def heap_increase_key(S,i,key):
  A[i]=key
  while i>0 and A[parent(i)]<A[i]:
    swap(A[i],A[parent(i)])
    i=parent(i)
def heap_insert(A,key):
  A=A+(key-1)
  heap_increass_key(A,len(A),key)

2.5.6 习题

2.6 冒泡排序

def bubble_sort(r):
    for i in range(0,len(r)):
      for j in range(len(r),i,-1):
        if r[j]<r[j-1]:
          swap(r[j],r[j-1])

设置exchange标记,使得算法提前终止

def bubble_sort(r):
    for i in range(0,len(r)):
      exchange = False
      for j in range(len(r),i,-1):
        if r[j]<r[j-1]:
          swap(r[j],r[j-1])
          exchange=True
      if exchange == False:
        return
void bubble_sort(sqlist R[], int n)
{
    int i,j,exchange;
    sqlist temp;
    for (i=0;i<n-1;i++)
    {
      exchange = 0;
      for (j=n-1;j>i;j--)
        if (R[j]<R[j-1])
        {
          temp = R[j];
          R[j]=R[j-1];
          R[j-1]=temp;
          exchange=1;
        }
      if (exchange==0)
        return;
    }
}

globally sequential

yes

time complexity

average: O(n2)

worst: O(n2)

best: O(n)

space complexity

O(1)

stability

stable

2.7 快速排序

2.7.1 快速排序入门

如何把一个数组分词大小两半?

把 A[p:r] 分成左右两半,其中归为元素为 A[r]

def partition(A,p,r):
  x = A[r]
  i=p-1
  for j in range(p,r):
    if A[j]<=x:
      i=i+1
      swap(A[i],A[j])
  swap(A[i+1],A[r])
  return i+1

快速排序

def quick_sort(A,p,r):
  if p < r:
    q = partition(A,p,r)
    quick_sort(A,p,q-1)
    quick_sort(A,q+1,r)

C++

void quick_sort(sqlist R[], int s, int t)
{
  int i=s,j=t;
  sqlist temp;
  if (s<t)
  {
    temp = R[s];
    while(i!=j)
    {
      while(j>i && R[j]>temp)
        j--;
      R[i] = R[j];
      while(i<j && R[i]<temp)
        i++;
      R[j] = R[i];        
    }
    R[i]=temp;
    quick_sort(R,s,i-1);
    quick_sort(R,i+1,t);
  }
}

globally sequential

no

但是每一趟都会归为一个元素(即,每一趟,都会确定一个元素的最终位置)

time complexity

average: O(nlgn)

worst: O(n2)

best: O(nlgn)

space complexity

O(lgn)

stability

unstable

2.7.2 快速排序进阶

性能分析

随机化

最坏情况分析

期望运行时间

2.8 计数排序

使用场景:假设n个输入元素的每一个都是在0-k区间内的一个整数,其中k为某个整数。

定义3个数组,A[1:n]为待排序数组。B[1:n]为存放排序的输出。C[0:k]为临时空间。

def count_sort(A,B,k):
  C=[0 for i in range(0,k)]
  for i in range(0,k+1):
    C[i]=A.count(i)
  for i in range(1,k+1):
    C[i] = C[i]+C[i-1]
  for j in range(len(A),0,-1):
    B[C[A[j]]] = A[j]
    C[A[j]] = C[A[j]]-1

time complexity

当 k=O(n) 时,为 Θ(n)

space complexity

O(n)

stability

stable

2.9 基数排序

无需掌握代码

这里写图片描述

globally sequential

no

time complexity

n个d位数,每一个数位有r个可能的取值,则

average: O(d(n+r))

worst: O(d(n+r))

best: O(d(n+r))

space complexity

O(n+r)

stability

stable

2.10 桶排序

了解即可

假设输入数据服从均匀分布,桶排序将[0,1)区间划分为n个大小相同的子区间,称为桶。然后将n个输入数据分别放到各个桶子中,对桶内的数据分别进行排序,然后将桶子连接。

2.11 归并排序

首先,将R[0:n-1]看成是n个长度为1的有序表,将相邻的有序表成对归并(将多个有序表组成一个新的有序表叫做归并),得到 n/2 个长度为2的有序表;然后,再将这些有序表成对归并,得到 n/4 个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序表。

由于上述的归并是对相邻的两个有序表进行的,因此叫做二路归并。如果归并操作在相邻的多个有序表中进行,则叫做多路归并排序。默认情况下所说的归并排序,指的是二路归并排序,如下图:

这里写图片描述

void merge(sqlist R[], int low, int mid, int high)
{
  sqlist R1;
  int i=low,j=mid+1;
  while (i<=mid &&j<=high)
    if (R[i]<=R[j])
    {
      R1.append(R[i]);
      i++;
    }
    else
    {
      R1.append(R[j]);
      j++;
    }
  while (i<=mid)
  {
    R1.append(R[i]);
    i++;
  }
  while (j<=high)
  {
    R1.append(R[j]);
    j++;
  }
  R.erase()
  R=R1;
}
void merge_pass(sqlist R[], int length, int n)
{
  for(i=0;i+2*length-1<n;i=i+2*lengtgh)
    merge(R,i,i+length-1,i+2*length-1);
  if (i+length-1<n)
    merge(R,i,i+length-1,n-1)
}
void merge_sort(sqlist R[],int n)
{
  int length;
  for (length=1;length<n;length=2*length)
    merge_pass(R,length,n);
}

globally sequential

no

time complexity

average: O(nlgn)

worst: O(nlgn)

best: O(nlgn)

space complexity

O(n)

stability

stable

MATPOWER的安装详细教程 MATPOWER的安装包实际为一个程序包,安装教程很简单,详见本文。 阅读详情

相关推荐

Python数据分析实战:用TIGRAMITE库5步搞定时间序列因果分析(附完整代码)

本文详细介绍了如何使用TIGRAMITE库进行时间序列因果分析,通过5个步骤从环境配置到模型优化,帮助读者掌握因果关系库的应用。附完整代码示例,适合数据分析师和研究人员快速实现复杂时间序列的因果发现。

weixin_29050271的博客 160

(二十)数据结构-顺序查找、分块查找

在数据集合中寻找满足某种条件的数据元素的过程称为查找

weixin_45579930的博客 996

【面试经验】大疆笔试-计算机视觉算法B卷

3、a=np.random.randn(3,3) b=np.random.randn(3,1) ,那么c=a*b的维度应该是:*是元素乘法或者torch.mul,@才是矩阵乘法或者torch.matmul,不会触发广播机制;8、将分辨率降低一半时,精标定内参(fx、fy、cx、cy、k1、k2、k3)焦距、光心、畸变系数将分别变成(fx、fy、cx/2、cy/2、k1、k2、k3),只能搜到光心变成一半,畸变系数不变。12、KLT算法在频闪光源、重复纹理、高速机动、环境照度低的情况下效果显著下降。

litterfinger的博客 1448

数据结构丨查找与排序

数据元素中某个数据项的值,用它可以标识一数据元素。根据给定的值,在查找表中确定一个其关键字等于给定值的记录或数据元素。为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度。对于含有n个记录的表,查找成功的平均查找长度为例如对于顺序查找,有。

qq_74315738的博客 1245

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1810

app编写需要哪种语言

原生App开发:优选Swift(iOS)和Kotlin(Android)。跨平台App开发:优选Flutter(Dart)和React Native(JavaScript)。游戏App开发:优选Unity(C#)和Unreal Engine(C++)。低代码工具:适合简单、快速的App制作。

fanying_98的博客 2071

查找和排序的基本操作:查找排序算法大集合

重点 查找算法着重掌握:顺序查找、二分查找、哈希表查找、二叉排序树查找。 排序算法着重掌握:冒泡排序、插入排序、归并排序、快速排序。 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线性表。 算法思想 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没...

dengquanyan6606的博客 1766

华为服务器RAID配置避坑指南:如何通过iBMC快速识别阵列卡型号并完成初始化

本文详细解析华为服务器RAID配置全流程,重点介绍通过iBMC快速识别阵列卡型号、硬盘健康诊断及RAID级别选择的场景化策略。提供从iBMC登录到缓存策略调优的实战技巧,帮助工程师避免常见配置陷阱,提升服务器存储系统性能和稳定性。

weixin_28475533的博客 492

【超详细】八大排序算法的各项比较以及各自特点

千万不要错过这篇,不然你就亏大发了。 八大排序,各显神通。 前言 一、排序的概念 二、各算法特点 1.直接选择排序 2.堆排序 3.直接插入排序 4.希尔排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 总结 前言 排序是计算机程序设计中一个非常重要的操作,它将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列。在有序的序列中查找元素的效率很高,(例如,折半查找法的平均查找长度为log2(n+1)−1log2(n+1...

qq_45615577的博客 3万+

【深度解析】解决 NVIDIA 显卡“掉卡”与 Xid 79 错误:开启持久化模式 (Persistence Mode)

【深度解析】解决 NVIDIA 显卡“掉卡”与 Xid 79 错误:开启持久化模式 (Persistence Mode)

Edward的博客 864

vue支付项目-APP支付宝支付功能

如果用户已安装支付宝客户端,商家 App 唤起支付宝完成支付,支付完后跳回到商家 App 内,最后展示支付结果。如果用户没有安装支付宝客户端,商家 App 内会调起支付宝网页支付收银台,用户登录支付宝账号,支付完后展示支付结果。1.点击按钮开通或者续费,会验证是否选择会员商品以及对协议是否查看选中(这里根据项目需要自行验证,可忽略),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;1.判断支付方式,如果是2,则是支付宝支付方式。

总结前端开发中遇到的问题,分享前端知识 1万+

查找算法总结:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找

查找算法包括:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找,B树 B树用于查找磁盘数据,这里不进行分析顺序查找思想:从头到尾一个一个比较,简单,时间复杂度O(n)java实现:public static int seqSearch(List<Integer> arr, int key) { for (int i = 0; i < arr.size(); i++) {

抬头看世界 6965

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2926

高级算法日记7:专题

专题作者:相国大人联系:sunxiangguodut@qq.com版权所有,禁止转载专题 专题一时间复杂度分析 1 普通复杂度函数的增长 2 递归与分治的复杂度主定理 专题二求解迷宫问题 专题三分治法深入 1 二元搜索问题 2 both max and min 3 dominating numbers 4 max sum two 专题四线性规划 专题五贪心算法 专题六中位数和顺序统计量 专题七散列表

相国大人 1081

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

高级算法日记5:二叉树

二叉树与分治作者:孙相国邮箱:sunxiangguodut@qq.com目录二叉树与分治作者孙相国 二叉树很重要 1 考纲分析 2 知识地位 3 实际应用 树的基本概念与性质 1 树的定义 2 树的逻辑表示方法 树形表示法 凹入表示法 广义表表示法 嵌套表示法 3 树的基本术语 节点的度与树的度 分支节点叶子节点孩子节点双亲节点兄弟节点 有序树和无序树 有根树和无根树 满m次树 完全m次树 路径与路

相国大人 2131

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2019年7月24日学习日记(二分、排序)

一、二分 1.整数集合上的二分 1)在单调增序列a中查找>=x的数最小的一个: while(l<r) { int mid=(l+r)/2; if(a[mid]>=x) r=mid; else l=mid+1; } return a[l]; 2)在单调增序列a中查找<=x的数中最大的一个 while(l<r) { int mid=(l+...

No Pain, No Gain . 212

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

小木的算法日记-亲手揭秘 TreeMap/TreeSet 背后的魔法 —— 二叉搜索树

核心引擎:TreeMap 的高效和有序性源于其底层的二叉搜索树(BST)。性能关键:BST 的性能取决于其平衡性。理想情况下是 O(logN),最坏情况下是 O(N)。工业级方案:实际的 TreeMap 使用红黑树等自平衡结构来保证性能。独门绝技:通过维护 size 字段,可以高效实现 rank 和 select 等高级功能。工作中常用 TreeMap/TreeSet 功能星级排序。

GetOver_的博客 1362

python:从数据结构到高级算法(更新至2017.09.08)

1. 主要参考文献:《算法导论》 《算法设计基础》沈孝钧 《C++数据结构》 《算法python》 Timus本系列博文的所有算法代码实现全部为python。再次基础上,有些题目会额外增加C++、java。2. 已经写完的肉(实时更新) 高级算法日记1:摸底课 高级算法日记2:第1次课笔记 高级算法日记3:python数据结构之栈和队列 高级算法日记4:查找与排序 高级算法日记5:二叉树 高

相国大人 1569

Java学习日记(一)

java前置课,基本了解内容

MEIZE的博客 1793

基于Node.js的本地加密日记软件:从AES-256-GCM到密钥管理的完整实现

数据加密是现代软件安全的核心基础,它通过密码学算法将明文信息转换为无法直接读取的密文,从而保障数据的机密性和完整性。其基本原理是利用密钥对数据进行数学变换,只有持有正确密钥的授权方才能还原原始内容。在工程实践中,对称加密算法如AES因其高效性被广泛用于本地数据保护,而非对称加密则多用于密钥交换和数字签名。数据加密的技术价值在于为敏感信息提供端到端的保护,防止在存储和传输过程中的未授权访问与篡改,是构建可信应用的关键基石。常见的应用场景包括本地文件加密、通信协议安全、隐私数据存储等。本文聚焦于**本地优先**

weixin_34262482的博客 342

Java高级架构师之路核心知识整理

包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等

老男孩的架构路 306

蓝桥杯国赛冲刺:从算法基础到每日一练的系统化路径

算法是计算机科学的核心,它通过一系列明确的指令解决特定问题,其效率由时间与空间复杂度衡量。理解算法原理,如分治、动态规划、贪心等思想,是构建高效程序的基础。掌握数据结构,如数组、链表、哈希表,是算法实现的物理载体。在工程实践中,算法能力直接决定了软件的性能上限与问题解决能力,尤其在数据处理、人工智能、搜索引擎等场景中至关重要。对于参加蓝桥杯等算法竞赛的开发者而言,系统化的知识体系与持续的刻意练习是提升竞争力的关键。本文聚焦于如何通过高效的“每日一练”方法,将算法基础与核心思想应用于竞赛准备,其中涉及对动态规

congsikuai0611的博客 406

Python学习路线:从新手到专家

Python是一门功能强大且易于上手的编程语言,它能够帮助你在多种领域内快速构建应用程序。按照上述的学习路径逐步前进,并结合实际项目的练习,相信不久之后你就能够熟练运用Python了。记住,不断实践是提高编程技能的关键。祝你在成为优秀Python程序员之路上取得成功!这份学习路线图提供了从基础知识到高级应用的全面指导。根据你的具体兴趣和职业目标,可以适当调整学习重点。希望这篇博客对你有所帮助!

QQ657205470的博客 2366

作为一个码农终于把MySQL日记看懂了,面经解析

第1大技能:程序设计和开发 数据结构和算法:常用数据结构,排序,检索等 面向对象编程、设计模式,掌握建模语言和建模工具:UML、MVC编程思想 高质量编码能力:重用性,低耦合,可扩展性,高性能,可维护性,安全性高 集成开发,版本控制,构建等工具:eclipse, svn, maven 等 脚本语言:Perl,PHP, Ruby, Python, Groovy等 第2大技能:Java开发 Java语言基础:异常处理,泛型,reflection,annotation; Java基本

m0_57431076的博客 159

4年Java经验,备战两月成功拿到美团、京东、字节offer

写在前面 本人4年java开发经验,从上家公司离职之后恰巧碰上疫情就在家闭关修炼!没日没夜的苦修2个多月,面试了几家公司,最终拿下美团、京东、字节跳动(java高级工程师)offer。 我是如何拿下美团等大厂的offer的呢,今天分享我的秘密武器 我把一位 蚂蚁金服资深架构师 整理的【Java核心知识点整理】资料啃完了,这份资料是我看到过整理得最全面、知识点解析得最透彻的一份java架构进阶资料。其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、

一入Java深似海 1265

保安日记之二叉树进阶面试题(中)

一、前言 接着上条关于二叉树的进阶的面试题 , 这篇博客也继续用二叉树这种数据结构来解决复杂的编程问题 二、二叉树的最近公共祖先 2.1 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

Ecliple的博客 427
上一篇: ubuntu django搭建网站3
下一篇: 高级算法日记5:二叉树
相国大人
博客等级 码龄10年 1009粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值