最全面、最前沿、最专业的游戏研发实战

提供最全面的游戏研发技能分享,让您在最短时间变成高级游戏工程师

查看:0|回复:6

【推荐】世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?

 attach_img

4

帖子

9

回复

13

积分
最后登录:
2025-04-06 11:19
注册时间:
2023-11-10 17:16
楼主
  发表于:2025-04-06 12:31:05|查看用户信息

世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?

是不是代码越少越好?有什么典型例子吗?请教各位技术大神。


2

帖子

9

回复

10

积分
最后登录:
2025-04-06 08:27
注册时间:
2024-12-05 09:32
1 楼
  发表于:2025-04-06 12:39:32|查看用户信息

还记得我因为获取第二天的日期而被开除的事儿吗?

public static Date getNextDay() throws InterruptedException {
	Thread.sleep(24 * 60 * 60 * 1000);
	return new Date();
}

哼哼,到了下家公司我可学聪明了

public static Date getNextDay() throws InterruptedException {
	TimeUnit.DAYS.sleep(1);
	return new Date();
}


这下优雅了吧,坐等老板表扬


3

帖子

11

回复

13

积分
最后登录:
2025-04-06 11:01
注册时间:
2024-07-11 15:29
2 楼
  发表于:2025-04-06 12:48:44|查看用户信息

快速排序(QuickSort): 快速排序是一个经典的排序算法,代码简洁高效。它通过选择一个“枢纽”元素,将数组分成两部分,一部分比枢纽小,另一部分比枢纽大,

然后递归地对两部分进行排序。

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)


艾拉托斯特尼筛法(Sieve of Eratosthenes): 这是一个用来找出所有小于某个数的素数的高效算法。它通过标记合数的方式,仅需O(n log log n)的时间复杂度。

def sieve(n):
    is_prime = [True] * (n + 1)
    p = 2
    while p * p <= n:
        if is_prime[p]:
            for i in range(p * p, n + 1, p):
                is_prime[i] = False
        p += 1
    return [p for p in range(2, n + 1) if is_prime[p]]


迷宫生成算法(Maze Generation - Recursive Backtracker): 迷宫生成算法通过递归回溯法可以在很少的代码量下生成复杂的迷宫。

import random

def generate_maze(width, height):
    maze = [[0 for _ in range(width)] for _ in range(height)]
    stack = [(0, 0)]
    while stack:
        (cx, cy) = stack[-1]
        maze[cy][cx] = 1
        neighbors = [(cx + 2, cy), (cx - 2, cy), (cx, cy + 2), (cx, cy - 2)]
        random.shuffle(neighbors)
        for (nx, ny) in neighbors:
            if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 0:
                stack.append((nx, ny))
                maze[(ny + cy) // 2][(nx + cx) // 2] = 1
                break
        else:
            stack.pop()
    return maze


汉诺塔(Towers of Hanoi): 汉诺塔问题是一个经典的递归算法问题,代码简洁但逻辑深刻。

def hanoi(n, source, target, auxiliary):
    if n == 1:
        print(f"Move disk 1 from {source} to {target}")
        return
    hanoi(n - 1, source, auxiliary, target)
    print(f"Move disk {n} from {source} to {target}")
    hanoi(n - 1, auxiliary, target, source)


合并排序(Merge Sort): 合并排序是另一种经典的排序算法,它采用分治法,代码简单但高效。

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result


5

帖子

11

回复

15

积分
最后登录:
2025-04-06 08:56
注册时间:
2023-02-26 14:02
3 楼
  发表于:2025-04-06 12:52:26|查看用户信息

一段清除缓存的代码:

function onCacheClearButtonClick()
{
    setTimeout(
        () => alert("缓存清除成功!"), 
        2000,
    );
}


4

帖子

9

回复

12

积分
最后登录:
2025-04-06 11:58
注册时间:
2023-02-26 14:02
4 楼
  发表于:2025-04-06 12:59:57|查看用户信息

8 皇后问题!

国际象棋棋盘上放 8 个皇后,问有多少种放法?

(皇后的走法是水平垂直和对角线位置就可以互相攻击,皇后就是这么牛,比中国象棋的车还厉害)

著名的 8 皇后问题,这个连 Gauss 都只得出 76 种解(实际上有 92 种), 当我愁眉苦思时,每每想到这, 内心就会平衡一点点。

8 皇后问题后来演变成 N 皇后问题,其中 N=1 时有一个解; 2、 3 时无解; N=4 时有两个解; N=5 时比 N=6 的解还多!


这说明什么问题?

一个“老婆” ( 皇后) 最稳定; 2 个 3 个后宫没法处理;若你能挺到 4 个, 就有办法了; 6 个“老婆”比 5 个“ 老婆” 关系还更好处理! 超过 6 个以后, 那就多多益善了,哈哈哈……

最后, 要处理 8 个皇后,高斯都没想清楚!


可见后宫是多么难治啊, 嘻嘻…

哎,闲扯远了。

下面贴一个 C++版,递归算法经典代码:

#include <iostream>
#include <cstdlib>
using namespace std;
#define StackSize 8 // could be set to 1, 4, 5, 6, 7,....N
int ans=0;
int top=-1;
int ColOfRow[StackSize]; //index represent the row, value is col
void Push(int col)
{ 	
	top++;
	ColOfRow[top]=col;
 } 
void Pop()
{ 
	top--;
}
// check put a Queen to position(row, col) is safe or not. 

bool isPosSafe(int row, int col)
{
 for(int i=0;i<row;i++)
  {
//check col is ok, row is increase invoke, same is impossible
	if(col==ColOfRow[i]){ 
		return false;
	}
// Y=kX+b, k=1 or k=-1, the Queen will attack each other 
	if(abs(col-ColOfRow[i])==(row-i)){
		return false;
	}
  }	
 return true; 
} 

void PrintBoard()
{
	cout<<"NO."<<ans<<":"<<endl; 
	for(int i=0;i<StackSize;i++) {
		for(int j=0;j<ColOfRow[i];j++) cout<<"_ ";
	cout<<"Q";
		for(int j=StackSize-1;j>ColOfRow[i];j--)
		cout<<" _"; 
	cout<<endl;
	}
	cout<<endl; 
}
// Should be start from 0 row, since the start point will impact future steps desision 
void PlaceQueen(int row) 
{
 for (int col=0;col<StackSize;col++)
 { 
	Push(col);
	if (isPosSafe(row,col))
	{
		if (row<StackSize-1)
			PlaceQueen(row+1);
		else
			{ 
			  ans++;
			  PrintBoard(); 
			}
	} 
	Pop(); 
 }
}
int main()
{
// Since Recursion invoke, start point should be 0, the first row 
	PlaceQueen(0); 
	cout<<"the total solutions is:"<<ans<<endl;
	return 0;
}

用 g++编译,运行后, 你就可得到如下结果:

1.jpg


3

帖子

7

回复

8

积分
最后登录:
2025-04-06 10:07
注册时间:
2023-02-26 14:02
5 楼
  发表于:2025-04-06 13:02:14|查看用户信息

项目的话,我推荐 Redis,仅几万行代码,算是 C 项目中数一数二的了。


个人拙见,代码量的多少并不代表什么,真正有意义的是是否以最优的方案解决了实际问题!比如 redis 它是一个基于内存的数据库, 在性能方面做的很好,也正因为它是基于内存的,所以它从最底层的设计到上层的各个角落都充满了对内存利用的优化,可以说对内存的使用是锱铢必较的,在内存和性能兼顾的权衡方面几乎做到了极致,有很多很好的解决方案可以学习。


读完(或某个模块)的 redis 源码,会对我们编程能力和认知的提升有很大的帮助。


4

帖子

6

回复

9

积分
最后登录:
2025-04-06 09:47
注册时间:
2024-06-15 22:06
6 楼
  发表于:2025-04-06 13:11:42|查看用户信息

代码量少,但能实现强大的算法或功能,主打一个程序设计之美


分块

给定具体的大小,定义一个函数以按照这个大小切割列表。

from math import ceil

def chunk(lst, size):
    return list(map(lambda x: lst[x*size: x*size + size], list(range(0, ceil(len(lst) / size)))))

chunk([1,2,3,4,5],2)
# [[1,2],[3,4],5]


解包

将打包好的成对列表解开成两组不同的元组。

array = [['a', 'b'], ['c', 'd'], ['e', 'f']]
transposed = zip(*array)
print(transposed)
# [('a', 'c', 'e'), ('b', 'd', 'f')]


展开列表

通过递归的方式将列表的嵌套展开为单个列表。

def spread(arg):
    ret = []
  for i in arg:
    if isinstance(i, list):
      ret.extend(i)
    else:
      ret.append(i)
  return ret

def deep_flatten(lst):
    result = []
  result.extend(spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, lst))))
  return result

deep_flatten([1, [2], [[3], 4], 5]) # [1,2,3,4,5]


将两个列表转化为字典

把两个列表转化为单个字典。

def to_dictionary(keys, values):
  return dict(zip(keys, values))

keys = ["a", "b", "c"]    
values = [2, 3, 4]
print(to_dictionary(keys, values))
# {'a': 2, 'c': 4, 'b': 3}


元素频率

根据元素频率取列表中最常见的元素。

def most_frequent(list):
    return max(set(list), key = list.count)

list = [1,2,1,2,3,2,1,4,2]
most_frequent(list)


Shuffle

打乱列表元素的顺序,它主要会通过 Fisher-Yates 算法对新列表进行排序。

from copy import deepcopy
from random import randint

def shuffle(lst):
  temp_lst = deepcopy(lst)
  m = len(temp_lst)
  while (m):
    m -= 1
    i = randint(0, m)
    temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
  return temp_lst


foo = [1,2,3]
shuffle(foo)   # [2,3,1], foo=[1,2,3]


快排

高效的排序算法,时间复杂度:O(n log n)

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)


Dijkstra算法

用于计算图中单源最短路径。其核心思想是通过贪心策略逐步扩展最短路径树。

import heapq

def dijkstra(graph, start):
    queue = [(0, start)]
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
    while queue:
        current_distance, current_vertex = heapq.heappop(queue)
        if current_distance > distances[current_vertex]:
            continue
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(queue, (distance, neighbor))
    return distances


二分查找

一种在有序数组中查找元素的高效算法,其时间复杂度为O(log n)

def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1


K-means

一种简单且广泛使用的聚类算法,用于将数据点分组到K个簇中。

import numpy as np

def k_means(data, k, max_iters=100):
    centroids = data[np.random.choice(range(len(data)), k, replace=False)]
    for _ in range(max_iters):
        clusters = {i: [] for i in range(k)}
        for point in data:
            distances = [np.linalg.norm(point - centroid) for centroid in centroids]
            cluster_idx = np.argmin(distances)
            clusters[cluster_idx].append(point)
        for i in range(k):
            centroids[i] = np.mean(clusters[i], axis=0)
    return centroids, clusters


蒙特卡洛方法(Monte Carlo Method)

通过随机抽样方法估计圆周率π的值。

import random

def estimate_pi(num_samples):
    inside_circle = 0
    for _ in range(num_samples):
        x, y = random.random(), random.random()
        if x**2 + y**2 <= 1:
            inside_circle += 1
    return 4 * inside_circle / num_samples


霍夫曼编码(Huffman Coding)

一种用于无损数据压缩的算法,其核心思想是通过构建最优前缀码来减少数据的大小。

import heapq
from collections import defaultdict, Counter

def huffman_encoding(data):
    freq = Counter(data)
    heap = [[weight, [char, ""]] for char, weight in freq.items()]
    heapq.heapify(heap)
    while len(heap) > 1:
        lo = heapq.heappop(heap)
        hi = heapq.heappop(heap)
        for pair in lo[1:]:
            pair[1] = '0' + pair[1]
        for pair in hi[1:]:
            pair[1] = '1' + pair[1]
        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
    return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))


最长公共子序列(Longest Common Subsequence, LCS)

用于计算两个序列之间的最长公共子序列的长度。

def lcs(X, Y):
    m = len(X)
    n = len(Y)
    L = [[0] * (n + 1) for _ in range(m + 1)]
    for i in range(m):
        for j in range(n):
            if X[i] == Y[j]:
                L[i + 1][j + 1] = L[i][j] + 1
            else:
                L[i + 1][j + 1] = max(L[i + 1][j], L[i][j + 1])
    return L[-1][-1]


共 1/1 页

0

帖子

0

回复

0

积分
最后登录:
1970-01-01 08:00
注册时间:
1970-01-01 08:00
会员必须登录才能发布帖子! 点击登录