算法数据结构

算法数据结构

万物皆结构,万法归算法

「算法与数据结构真解」

以算法思想与数据结构为核心,贯穿不同编程语言的实现。这里不问语言门派,只探算法本源。


「数据结构篇」· 万物皆结构

📊 「刷题一统春秋」

📊 「线性结构」

「数组与链表」:内存的连续与离散之美
  • C 列表实战 —— 从指针到链表的演练记录。
  • 计划:动态数组扩容策略、双向链表实现比较
「栈与队列」:后进先出与先进先出的哲学
  • 计划:递归调用栈剖析、消息队列应用场景
  • 计划:双端队列的妙用、优先队列实现方案

🌳 「树形结构」

「二叉树」:二分思想的具象化
  • 计划:二叉搜索树增删查、AVL树旋转平衡
  • 计划:红黑树原理图解、B树在数据库中的应用
「堆结构」:优先级的艺术
  • 计划:二叉堆实现、堆排序的原地版本
  • 计划:Top K 问题的多种解法对比

🔑 「哈希世界」

「哈希表」:从键到值的瞬间映射
  • 计划:哈希冲突解决策略、布谷鸟哈希原理
  • 计划:一致性哈希在分布式系统中的运用

🕸️ 「图论基石」

「图的表示」:邻接矩阵与邻接表的抉择
  • 路线规划 —— Grid-Based Route (Re-)Planning
  • 计划:稠密图与稀疏图的存储优化

「算法篇」· 思维的模式

🔍 「搜索算法」

「深度优先」:一条路走到黑的探索
  • 计划:回溯法解数独、排列组合问题模板
「广度优先」:层层递进的扩张
  • 计划:最短路径问题、状态空间搜索

🔄 「排序算法」

「比较排序」:基于比较的秩序建立
  • 计划:快速排序优化、归并排序的迭代实现
  • 计划:堆排序的建堆技巧
「非比较排序」:突破O(nlogn)的界限
  • 计划:计数排序的适用场景、基数排序的位数处理

🧩 「动态规划」

「经典模型」:从斐波那契到背包问题
  • 计划:状态定义技巧、状态转移方程推导
  • 计划:背包九讲精要、区间DP的遍历顺序
「字符串DP」:编辑距离与最长公共子序列
  • 计划:DNA序列比对中的DP应用

⚡ 「贪心算法」

「局部最优」:何时贪心能得全局最优
  • 计划:区间调度问题、霍夫曼编码构造

✂️ 「分治思想」

「大事化小」:递归分解的艺术

  • 计划:最近点对问题、矩阵乘法的Strassen算法

「高级专题」· 思想的融合

🎯 「算法设计范式」

「双指针」:相向而行的智慧
  • 计划:滑动窗口模板、快慢指针判环
「位运算」:0与1的魔法
  • 计划:状态压缩技巧、位操作优化

📈 「复杂度分析」

「时间空间」:算法效率的度量衡

  • 计划:主定理的应用、均摊分析实例

「实战演练」· 知行合一

💻 「LeetCode精讲」

「高频题目」:面试常考题型深度解析
  • 计划:每题多语言实现、多种解法对比
  • C语言趣味算法 —— 汉诺塔、百鸡百钱、常胜将军、约瑟夫环。

🏆 「竞赛算法」

「ACM模板」:竞赛常用算法模板库
  • 计划:并查集优化、线段树懒更新

棋谱篇

C语言趣味算法

◀ 返回

汉诺塔

汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从上往下按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新排在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

#include <stdio.h>

void move(char x, char y)
{
    static int cnt = 0;
    printf("%d %c => %c\n", ++cnt, x, y);
}

void hanno(int n, char a, char b, char c)
{
    if ( n == 1 )
        move(a, c);
    else {
        hanno(n-1, a, c, b);
        move(a, c);
        hanno(n-1, b, a, c);
    }
}

int main( void )
{
    hanno(3, 'A', 'B', 'C');
    return 0;
}

百鸡百钱

今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

#include <stdio.h>

int main( void )
{
    int x;
    int y;
    int z;

    for (x=0; x<=100; x++)
    {
        for (y=0; y<=100; y++)
        {
            z = 100-x-y;
            if (z%3==0 && 5*x+3*y+z/3==100)
            {
                printf("公鸡%d,母鸡%d,小鸡%d\n",
                    x, y, z);
            }
        }
    }

    return 0;
}

常胜将军

现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”