一个比较高效的无限分类算法
2009-10-18 21:33
232 查看
无限分类是我们做网站经常遇到的问题,一般我们建一个自关联的表,用一个字段表示父节点,如下商品分类表:
CREATE TABLE [dbo].[cityaddr](
[id] [int] IDENTITY(1,1) NOT NULL,
[parentid] [int] NOT NULL CONSTRAINT [DF_cityaddr_pid] DEFAULT ((0)),
[city] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[pstr] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[rank] [int] NOT NULL CONSTRAINT [DF_cityaddr_level] DEFAULT ((0)),
CONSTRAINT [PK_cityaddr] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY
添加了psrt字段,用来记录路径,路径中用“,”隔开,添加时只要将父节点的路径加上父节点表示即可。删除时加上where id=@id or pstr like ‘%,@id,%’,可删除全部子孙节点。获取路径 where id in (" + caddr.pstr.Trim(',')……
部分代码:
/// <summary>
/// 获取路径:父->子
/// </summary>
public List<Fz.Model.cityaddr> GetPath(int addrid)
{
Model.cityaddr caddr = GetModel(addrid);
if (!string.IsNullOrEmpty(caddr.pstr.Trim(',')))
{
return GetModelList("id in (" + caddr.pstr.Trim(',') + ") order by rank");
}else{
throw new Exception("没有父节点");
}
}
/// <summary>
/// 获取路径:父-子
/// </summary>
public string[] GetPathStr(int addrid)
{
List<Fz.Model.cityaddr> laddr = GetPath(addrid);
string[] ret = new string[laddr.Count];
for (int i = 0; i < laddr.Count;i++ )
{
if (!string.IsNullOrEmpty(laddr[i].city))
{
ret[i] = laddr[i].city;
}
}
return ret;
}
/// <summary>
/// 获取所有子节点
/// </summary>
public List<Fz.Model.cityaddr> GetAllSon(int addrid)
{
string strwhere ="pstr like '%,"+ addrid + ",%' order by rank";
return GetModelList(strwhere);
}
/// <summary>
/// 获取子节点
/// </summary>
public List<Fz.Model.cityaddr> GetSon(int addrid)
{
return GetModelList("pid="+addrid);
}
/// <summary>
/// 获取子节点,返回增加的项的d
/// </summary>
public int Add(int pid, string city)
{
Model.cityaddr ca = GetModel(pid);
if (ca == null)
{
ca = new Fz.Model.cityaddr();
ca.parentid = 0;
ca.pstr = ",";
ca.rank = 1;
}
else
{
ca.parentid = pid;
ca.pstr = ca.pstr + pid + ",";
ca.rank++;
}
ca.city = city;
return Add(ca);
}
CREATE TABLE [dbo].[cityaddr](
[id] [int] IDENTITY(1,1) NOT NULL,
[parentid] [int] NOT NULL CONSTRAINT [DF_cityaddr_pid] DEFAULT ((0)),
[city] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[pstr] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[rank] [int] NOT NULL CONSTRAINT [DF_cityaddr_level] DEFAULT ((0)),
CONSTRAINT [PK_cityaddr] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY
添加了psrt字段,用来记录路径,路径中用“,”隔开,添加时只要将父节点的路径加上父节点表示即可。删除时加上where id=@id or pstr like ‘%,@id,%’,可删除全部子孙节点。获取路径 where id in (" + caddr.pstr.Trim(',')……
部分代码:
/// <summary>
/// 获取路径:父->子
/// </summary>
public List<Fz.Model.cityaddr> GetPath(int addrid)
{
Model.cityaddr caddr = GetModel(addrid);
if (!string.IsNullOrEmpty(caddr.pstr.Trim(',')))
{
return GetModelList("id in (" + caddr.pstr.Trim(',') + ") order by rank");
}else{
throw new Exception("没有父节点");
}
}
/// <summary>
/// 获取路径:父-子
/// </summary>
public string[] GetPathStr(int addrid)
{
List<Fz.Model.cityaddr> laddr = GetPath(addrid);
string[] ret = new string[laddr.Count];
for (int i = 0; i < laddr.Count;i++ )
{
if (!string.IsNullOrEmpty(laddr[i].city))
{
ret[i] = laddr[i].city;
}
}
return ret;
}
/// <summary>
/// 获取所有子节点
/// </summary>
public List<Fz.Model.cityaddr> GetAllSon(int addrid)
{
string strwhere ="pstr like '%,"+ addrid + ",%' order by rank";
return GetModelList(strwhere);
}
/// <summary>
/// 获取子节点
/// </summary>
public List<Fz.Model.cityaddr> GetSon(int addrid)
{
return GetModelList("pid="+addrid);
}
/// <summary>
/// 获取子节点,返回增加的项的d
/// </summary>
public int Add(int pid, string city)
{
Model.cityaddr ca = GetModel(pid);
if (ca == null)
{
ca = new Fz.Model.cityaddr();
ca.parentid = 0;
ca.pstr = ",";
ca.rank = 1;
}
else
{
ca.parentid = pid;
ca.pstr = ca.pstr + pid + ",";
ca.rank++;
}
ca.city = city;
return Add(ca);
}
相关文章推荐
- 我写的一个高效递归函数,可用之轻松获取无限级子分类
- QT编写的数独游戏及一个准确高效生成算法
- 小程序一个,可以比较那种算法好哈
- 数据挖掘分类算法比较
- 一个比较优美的partition算法的写法
- 左右值无限分类实现算法[转]
- 关于时间比较的一个算法
- 各种分类算法比较
- Javascript无限分类算法的实现(转)
- 数据挖掘分类算法比较
- 一个更简单的无限级分类菜单代码
- 有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里,请找出丢失的数字,最好能有程序,最好算法比较快
- 比较简单实用的PHP无限分类源码分享(思路不错)
- 对于一个m*n的整数矩阵,其中每一行和每一列的元素都按升序排列,设计一个高效的算法判断一个数值是否存在,并给出位置
- 各种分类算法优缺点比较
- 基于图像形状的一种比较漂亮的分类算法
- 无限级分类中的一个高级BUG
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 自制无限级分类算法。
- 一个高效的洗牌算法分析