在数据库环境中实现“贪心算法”,通常不是像在普通程序里写一个 while 循环那样直接,而是要结合 SQL 的表达能力 或 存储过程 / 脚本语言 来完成。下面按常见场景给你一个清晰思路。
贪心算法的核心是:
每一步都选当前“最优”的局部解,期望得到全局近似最优。
在数据库中,典型应用包括:
适用:每一步只依赖“当前最大值/最小值”
WITH ranked_suppliers AS (
SELECT *,
SUM(quantity) OVER (
ORDER BY price ASC
) AS cum_quantity
FROM suppliers
)
SELECT *
FROM ranked_suppliers
WHERE cum_quantity <= :need_quantity;
✅ 优点:简单、高效
❌ 缺点:复杂状态依赖难表达
适用:需要“一步步推进”的贪心过程
WITH RECURSIVE greedy AS (
SELECT id, start_time, end_time
FROM intervals
ORDER BY start_time
LIMIT 1
UNION ALL
SELECT i.id, i.start_time, i.end_time
FROM intervals i
JOIN greedy g
ON i.start_time >= g.end_time
ORDER BY i.start_time
LIMIT 1
)
SELECT * FROM greedy;
⚠ 注意:递归 CTE 在不同数据库中语法略有差异(PostgreSQL / MySQL 8+ / SQL Server)
适用:复杂贪心逻辑、需要状态更新
DECLARE cur CURSOR FOR
SELECT id, value FROM items ORDER BY value DESC;
OPEN cur;
FETCH cur INTO item;
WHILE FOUND AND capacity > 0 DO
IF item.value <= capacity THEN
INSERT INTO result VALUES (item.id);
capacity := capacity - item.value;
END IF;
FETCH cur INTO item;
END WHILE;
✅ 灵活
❌ 性能依赖数据库实现
最稳方案:
rows = db.query("SELECT * FROM items ORDER BY score DESC")
for r in rows:
if capacity <= 0: break
if r.cost <= capacity:
select(r)
capacity -= r.cost
✅ 易维护、易调试
✅ 可利用索引和缓存
❌ 用 JOIN 硬算所有组合
❌ 忽视 ORDER BY 导致贪心顺序错误
❌ 在 SQL 里强行写复杂状态机
如果你能告诉我:
我可以直接给你可运行的 SQL 或存储过程示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。