数据结构与算法笔记(五) 链表的应用

1.箱子排序:

假设:

用链表保存一个班级学生的清单,节点的数据域包括:姓名,社会保险号码,作业和考试的分数,所有作业和加权的总分。假设分数介于(0-100)之间,按照总分对学生进行排序,一种较快的排序方法是箱子排序(bin sort):把相同分数的节点放到一个箱子里,然后把箱子连接起来就得到有序的链表

箱子排序要做的是:(1)逐个删除输入链表的节点,把删除的节点分配到相应的箱子中9,每个箱子相当于一个链表  (2)把每个箱子中的链表收集起来并连接,使其成为一个有序的链表

定义学生记录:

struct studentRecord
{
int score;
string name;
// 构造方法
studentRecord(const string& name, int score)
{
this->name = name;
this->score = score;
}
int operator !=(const studentRecord& x) const
{
return score==x.score;
}
operator int() const
{
return score;
}
};

凸包:

多边形:至少有三条直线便的平面封闭图形,多边形包含边线上的点,也包含变现内的点。多边形的任意两个点的连线都不包含多边形以内的点,则称为凸多边形.

一个平面点集S的凸包:包含点集S的最小凸多边形

多边形的定点称为S的极点。

寻找平面点集S的凸包的算法:

1.处理退化情况

S的点数少于3;

S的所有点在同一条直线上, 返回包含S的所有点的最短直线的定点

2. 极角排序:

假定在S的凸包内取一点X, 从X向下画垂线。垂线和X到点s_i之间的连线有一个夹角,称为极角。

按照极角的递增次序排列S的点,如果极角相同,则按照与X的距离递增来排列S的点。

3.寻找并删除非极点的点

如果u,v,w是按照逆时针排列的三个连续的极点,从u->v,w->v之间的连线的夹角应该大于180,当按照极角排列的三个点的极角小于等于180时,则第二个点不是极点,可以将其删除。因为当按照逆时针方向在一个凸多边形上行走时,所有的转弯都是向左转。

采用双向循环链表存储数据

假设p时链表中的点(y坐标最小或者x坐标最大, 因为这个点肯定在凸包上):

for(x=p, rx=x->right; p!=rx)
{
rrx = rx->right;
if(invalid(x,rx,rrx)) // 三个点不满足条件, 删除rx
{
rx = x;
x = rx;
}
else
{
x = rx;
rx = rrx;
}
}

---------------------------------------------------分割线-----------------------------------------------

 

posted @   Alpha205  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示