项目中的一个算法问题

alian_1126 2010-07-08 06:44:55

string[] 序列 = { "1", "1#2", "1#2#3", "1#2#3#4", "1#2#5", "1#2#5#6" };
int[] 组号= { 1, 2, 3, 4, 5, 6 };


我在做一个项目,有个问题,需要一个算法,比如在一张电路图上的线路(线路可能存在分支)上有6个节点,在各个节点都装有报警设备,为每个节点上的报警设备都编有相应的组号,现假设从第一个节点到第六个节点的组号分别为1、2、3、4、5、6,第1、2节点在主干线上,3、4节点在分支线一,5、6节点在分支线二,为每个节点都编有线内序列来判断分支的走向,比如节点1是"1",节点2是"1#2",节点3是"1#2#3",节点4是"1#2#3#4",节点5是"1#2#5",节点6是"1#2#5#6",由此可根据线内序列判断出1、2、3、4为分支一,1、2、5、6为分支二,如何根据上面的两数组得到两个分支的最后一个节点的线内序列。组号不一定按数字大小顺序排列,以上只是举个例子。
...全文
512 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangshun 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 alian_1126 的回复:]

我想得到在末尾的最后的两个点(实际上处于末尾的可能不止两个点),怎么实现?
[/Quote]

那你要的结果到底是什么?
  • 打赏
  • 举报
回复
对算法来说,测试时要使用足够多的数据(超过你的峰值上限100%更好),你可能才能发现真正的算法问题所在。切记。
wanghui0380 2010-07-09
  • 打赏
  • 举报
回复
额,这是一个规则引擎。

c#里面的规则引擎方面的例子不多,但也可以找得到几款。lz可以google之

ps:大部分规则引擎都是采用Rete算法的,Rete算法的中文资料不太多,偶尔可以在博客园看到几篇零星的片段
http://www.google.com/search?hl=en&source=hp&q=%E5%8D%9A%E5%AE%A2%E5%9B%AD+Rete%E7%AE%97%E6%B3%95&aq=f&aqi=&aql=&oq=&gs_rfai=
小夏天~ 2010-07-09
  • 打赏
  • 举报
回复
帮不上忙,不好意思..
alian_1126 2010-07-09
  • 打赏
  • 举报
回复
我想得到在末尾的最后的两个点(实际上处于末尾的可能不止两个点),怎么实现?
alian_1126 2010-07-09
  • 打赏
  • 举报
回复

Enumerable.Repeat(i == 0 ? "" : " ", i + 1).Aggregate((s1, s2) => string.Format("{0}{1}", s1, s2)) + (i == 0 ? "" : "┗");

哪位前辈解释下
alian_1126 2010-07-09
  • 打赏
  • 举报
回复
code=C#]Enumerable.Repeat(i == 0 ? "" : " ", i + 1).Aggregate((s1, s2) => string.Format("{0}{1}", s1, s2)) + (i == 0 ? "" : "┗");[[/code]
这句是什么意思呢,不是很懂
平生我自如 2010-07-09
  • 打赏
  • 举报
回复
帮顶一下吧……
jiangshun 2010-07-09
  • 打赏
  • 举报
回复
       public static string getTabStr(int i)
{
return Enumerable.Repeat(i == 0 ? "" : " ", i + 1).Aggregate((s1, s2) => string.Format("{0}{1}", s1, s2)) + (i == 0 ? "" : "┗");
}


static void Main(string[] args)
{


string[] List = { "1", "1#2", "1#2#3", "1#2#3#4", "1#2#5", "1#2#5#6" };

Dictionary<string, int> _l = new Dictionary<string, int>();
foreach (string s in List)
{
if (s.IndexOf("#") > -1)
_l.Add(s.Split('#').Last(), s.Length - s.Replace("#", "").Length);
else
_l.Add(s, Convert.ToInt32(s));
}

foreach (var D in _l)
{
Console.WriteLine(getTabStr(D.Value) + D.Key);
}
/*
┗1
┗2
┗3
┗4
┗5
┗6
*/
alian_1126 2010-07-09
  • 打赏
  • 举报
回复
请问有没具体的实例参考?有代码就好了,我也想过用树,只是觉得有点抽象,不知如何下手
zhoujk 2010-07-09
  • 打赏
  • 举报
回复
如果使用正确的数据结构,这个问题的算法就可以很简单了。
使用树,从根开始,每个节点都是包含线路上与它相关的所有节点(不包括逆向部分),如:1下面的节点是2
2 的节点有3,5
5下面包含6
从指定节点开始,返回它的父目录直到根,即可完成。
remagon 2010-07-09
  • 打赏
  • 举报
回复
好一点的办法,设一个长度为节点数的bool数组,初始值为true

然后遍历节点,如果线内序列两个节点以上,则把倒数第二个节点对应的数组值改为false

最后数组里为true的节点就是叶子节点
remagon 2010-07-09
  • 打赏
  • 举报
回复
最笨的方法遍历每个节点在其它节点的线内序列中是否存在,存在的话就表示不是叶子节点
angel6709 2010-07-09
  • 打赏
  • 举报
回复
cactus123456 2010-07-09
  • 打赏
  • 举报
回复
如果你要找全部叶子节点也很简单呀
1,有二叉树性质,最长的字符串肯定是叶子节点,因此还是要找出最长的字符串,多余1个就随便取一个,该串必为叶子节点
2,删除该字符串对应的路径,例如1234,将删除1,12,123,1234
3,在剩下的序列中,重复1,2,直到没有序列
你的例子2次迭代就没有序列了,因此就这2个叶子节点
alian_1126 2010-07-09
  • 打赏
  • 举报
回复
这样说不知道会不会好点:
int[] 组号= { 1, 2, 3, 4, 5, 6 };
string[] 序列 = { "1", "1#2", "1#2#3", "1#2#3#4", "1#2#5", "1#2#5#6" };
组号:线路图上的所有点;
序列:所有组号在线路图上的路径,例如"1"是第1组的路径,“1#2”是第2组的路径,“1#2#3”是第3组的路径,“1#2#3#4”是第4组的路径,“1#2#5"是第5组的路径,"1#2#5#6"是第6组的路径;

这些组号是数据库里6条记录,没排序,从序列字段可以看出这些组号是成一棵树,我想知道在程序里读出这些记录后,如何确定哪些数据库记录是在叶子节点上的。
cactus123456 2010-07-09
  • 打赏
  • 举报
回复
这么简单的东西要算法?
string[] 序列 = { "1", "1#2", "1#2#3", "1#2#3#4", "1#2#5", "1#2#5#6" };
,用一个for循环得到字符串长度最大的那些数组就可以了,如果>2个,那就随便取两个不就可以了。
另外int[] 组号= { 1, 2, 3, 4, 5, 6 };这个数组对本题没有意义呀。
tashiwoweiyi 2010-07-09
  • 打赏
  • 举报
回复
tashiwoweiyi 2010-07-09
  • 打赏
  • 举报
回复
对算法来说,测试时要使用足够多的数据(超过你的峰值上限100%更好),你可能才能发现真正的算法问题所在。切记。
wanghui0380 2010-07-09
  • 打赏
  • 举报
回复
假设没有回环,他就是一颗树。那么直接构造treeview就可以解决

加载更多回复(3)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧