当前位置: 首页 > wzjs >正文

做网站的好公司有哪些网店运营是做什么的

做网站的好公司有哪些,网店运营是做什么的,会宁县建设局网站,赤城县城乡建设局网站1、传统建堆 vs 线性建堆 堆排序的核心步骤是建堆与排序,其中建堆的效率直接影响整体性能。传统逐个插入的建堆方法时间复杂度为 O(n log n),而弗洛伊德(Floyd)提出的线性建堆法可将时间复杂度优化至 O(n),效率提升显…

在这里插入图片描述

1、传统建堆 vs 线性建堆

堆排序的核心步骤是建堆排序,其中建堆的效率直接影响整体性能。传统逐个插入的建堆方法时间复杂度为 O(n log n),而弗洛伊德(Floyd)提出的线性建堆法可将时间复杂度优化至 O(n),效率提升显著。


2、线性建堆法原理

核心思想:从最后一个非叶子节点开始,自底向上、从右到左对每个节点执行**下沉(Sift Down)**操作,将无序数组调整为堆结构。

数学证明

  • 完全二叉树中,高度为 ( h ) 的节点最多有 ( \frac{n}{2^{h+1}} ) 个
  • 每个节点的下沉操作最多需要 ( h ) 步
  • 总操作次数为:

在这里插入图片描述


3、堆排序流程

  1. 建堆:将数组初始化为大顶堆(升序排序时)。
  2. 排序
    • 交换堆顶(最大值)与堆末尾元素。
    • 对堆顶进行向下调整(sift_down)。
    • 重复直至堆为空,数组有序。

4、线性建堆法优化

  • 传统尾插法:逐个插入元素,向上调整,时间复杂度 O(n log n)

  • 线性建堆法

    • 核心思想:从最后一个非叶子节点开始,自底向上进行向下调整。

    • 时间复杂度O(n)(数学推导见下方)。

    • 实现步骤

      def build_heap(arr):  n = len(arr)  for i in range(n//2 - 1, -1, -1):  # 从最后一个非叶子节点逆序调整  sift_down(arr, i, n)  
      
  • 时间复杂度推导

    • 每层节点数为 (2^i),调整次数为 (h - i)((h) 为树高)。
    • 总调整次数 (S = \sum_{i=0}^{h} 2^i (h - i) = O(n))。

5、代码示例

def heap_sort(arr):n = len(arr)# 线性建堆(弗洛伊德算法)for i in range(n//2 - 1, -1, -1):  # 从最后一个非叶子节点开始heapify(arr, n, i)# 排序阶段(逐个提取堆顶)for i in range(n-1, 0, -1):arr[0], arr[i] = arr[i], arr[0]  # 交换堆顶与末尾元素heapify(arr, i, 0)               # 调整剩余部分为堆def heapify(arr, heap_size, root):largest = rootleft = 2 * root + 1right = 2 * root + 2# 找到当前节点与子节点中的最大值if left < heap_size and arr[left] > arr[largest]:largest = leftif right < heap_size and arr[right] > arr[largest]:largest = right# 若最大值不在根节点,交换并递归调整子树if largest != root:arr[root], arr[largest] = arr[largest], arr[root]heapify(arr, heap_size, largest)# 测试示例
arr = [3, 1, 4, 1, 5, 9, 2, 6]
heap_sort(arr)
print("排序结果:", arr)  # 输出: [1, 1, 2, 3, 4, 5, 6, 9]

6、蚂蚁问题的两种解法

1、小顶堆模拟法:精准事件驱动

1. 核心思想

通过优先队列(小顶堆)管理所有可能的事件(掉落/碰撞),按时间顺序处理每个事件,动态更新蚂蚁状态,最终确定每只蚂蚁的掉落方向。

2. 关键步骤
掉落
碰撞
初始化
计算初始掉落时间
计算相邻碰撞时间
构建事件堆
堆是否为空?
取出最早事件
事件类型
记录方向并标记失效
交换方向,生成新事件
移除相关事件
输出结果
3. 技术细节
  • 事件类型

    • 掉落事件:蚂蚁到达端点的时间
    • 碰撞事件:两只相向蚂蚁相遇的时间(计算式为 (pos2 - pos1) / (v1 + v2),当速度均为1时简化为 (pos2 - pos1)/2
  • 失效事件处理

    • 每个事件需检查涉及蚂蚁是否仍活跃
    • 使用版本号或状态标记跳过过期事件
  • 碰撞后更新

    • 交换方向后重新计算该蚂蚁的掉落时间
    • 检查新的相邻蚂蚁是否形成碰撞对
4. 代码优化关键
# 碰撞事件生成函数(相邻蚂蚁对)
def generate_collision_events(ants):events = []for i in range(len(ants)-1):a1, a2 = ants[i], ants[i+1]if a1.dir == 1 and a2.dir == -1:collision_time = (a2.pos - a1.pos) / (a1.speed + a2.speed)events.append(Event(collision_time, 'collision', [a1, a2]))return events# 事件处理核心循环(伪代码)
while not heap.empty():event = heap.pop()if any(not ant.active for ant in event.ants):continuehandle_event(event)
5. 复杂度分析
操作时间复杂度说明
初始化事件堆O(n)n为蚂蚁数量
处理碰撞事件O(m log m)m为事件总数(最坏O(n²)
空间复杂度O(m)堆存储所有潜在事件

2、取巧观察法:数学之美

1. 核心洞察
  • 物理等效性:碰撞可视为蚂蚁交换身份后继续原方向移动
  • 守恒定律
    • 蚂蚁相对顺序始终保持不变
    • 向左/右移动的蚂蚁数量守恒
2. 数学证明
  • 命题:最终从左侧掉落的蚂蚁数 = 初始向左的蚂蚁数(记为 L),右侧同理(R = 初始向右数

  • 证明

    1. 设蚂蚁序列为 A1, A2, ..., An(按位置从左到右排序)
    2. 碰撞后,任意两只蚂蚁的相对顺序不变
    3. 初始向左的蚂蚁中,位置最右的 L 只会被右边 R 个向右蚂蚁“推回”
    4. 因此,前 L 个从左侧掉落的蚂蚁对应初始向左的蚂蚁
3. 实现步骤
def quick_solution(directions):left_count = directions.count(-1)right_count = len(directions) - left_countresult = []# 按初始顺序遍历,前left_count个掉左,其余掉右for d in directions:if d == -1:result.append('左' if left_count > 0 else '右')left_count -= 1else:result.append('右' if right_count > 0 else '左')right_count -= 1return result# 示例:directions = [-1, 1, -1]
# 输出:['左', '右', '左']
4. 正确性验证
测试用例输入方向预期输出实际输出
所有初始向右[1, 1, 1][‘右’, ‘右’, ‘右’]✔️
交替方向[-1, 1, -1, 1][‘左’, ‘左’, ‘右’, ‘右’]✔️
边缘碰撞[1, -1][‘右’, ‘左’]✔️

7、方法对比与选型

维度小顶堆模拟法取巧观察法
时间复杂度O(n² log n)(最坏)O(n)
空间复杂度O(n²)(存储碰撞事件)O(1)
适用场景不同速度、实时动态过程速度相同、仅需最终方向统计
扩展性支持复杂变种(如不同速度、多杆)仅限基础问题
实现难度高(需处理事件优先级、失效检测)极低(直接统计即可)

8、总结亮点

  • 蚂蚁问题:通过“逻辑距离”和“相对顺序守恒”实现降维打击。
  • 线性建堆法:以 O(n) 时间颠覆传统建堆认知,核心是“节点越多,调整越少”。
  • 实战意义:堆排序在 Top K、优先级队列等场景中广泛应用,线性建堆法显著提升性能。

🔗 下期预告堆排序:如何维护Top-K元素和中位数?

http://www.dtcms.com/wzjs/195658.html

相关文章:

  • 网站建设的销售好做吗今日新闻头条热点
  • 淘宝联盟的网站怎么做做网上推广
  • 壁纸公司网站源码百度收录时间
  • 快速排名怎么做国内seo排名
  • 网站升级改版方案成都网站快速排名优化
  • 如何利用淘宝建设网站挣钱网络推广有哪几种方法
  • 建设网站第一部分上海百度推广电话客服
  • 用html怎么做网站尾部百度推广网站平台
  • 做网站搞个物理服务器可以发外链的网站整理
  • 做房产买卖哪些网站可以获客seo外包公司报价
  • 网站建设颜色流量平台有哪些
  • 桂园精品网站建设费用抖音关键词挖掘工具
  • 在线做mtv网站西安百度公司官网
  • 网站建设 技术 哪些方面重庆网络推广公司
  • 怎么做新网站的推广seo分析案例
  • zencart官方网站优化师是干嘛的
  • 电影网站建设报价优化seo是什么
  • 做词云图的网站西安百度推广竞价托管
  • 自己做局域网站免费关键词挖掘网站
  • 无锡网站建设2345网址大全
  • 上海做网站哪里有线上营销推广的公司
  • 酒店网站建设项目报告书永久免费客服系统有哪些软件
  • thinkphp怎么做网站最新新闻事件今天疫情
  • 四川省建设领域信用系统网站在线crm软件
  • 做设计的网站有哪些网站建设制作
  • 南通做网站优化公司淮北seo排名
  • 荆门网站开发有哪些百度云盘搜索引擎入口
  • 大连网站怎么百度网页版怎么切换
  • 做问卷赚钱网站百度商家平台
  • 优秀网站大全在线bt种子