求高效的组合算法

止戈而立 2008-10-15 09:37:30
private void Combining(string str,int count)
//str中没有重复字符,要求将str中的字符任意提取出count个进行组合。不用排列。str的长度大于等于count。
{
if(str.Length<count) return;
//这里的代码如何写?
}
...全文
1244 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyfwyf88 2011-12-02
  • 打赏
  • 举报
回复
= =这家伙吃个饭吃了三年!![Quote=引用 21 楼 min_jie 的回复:]

不好意思,我把帖子给结了。。吃饭回来给你转些分数吧。。
[/Quote]
编号27149 2008-10-15
  • 打赏
  • 举报
回复
private string[] Combining(string str,int count)
//str中没有重复字符,要求将str中的字符任意提取出count个进行组合。不用排列。str的长度大于等于count。
{
Random number=new Random(); //获取随机数
string [] a=new string[count];
string [] s=new string[str.Length];
string dangqian=null;
if(str.Length>=count)
{
for(int i=0;i<str.Length;i++)
{
s[i]=str.Substring(i,1);
}
for(int j=0;j<count;j++)
{
face=number.Next(0,str.Length);
dangqian=s[face];
for(int k=0;k<=j;k++)
{
if(a[k]!=dangqian)
{
if(a[k]==null)
{
a[k]=dangqian;
k=j;
}
}
else
{
face=number.Next(0,str.Length);
dangqian=s[face];
k=-1;
}
}
}
}
return a;
}

试试吧,现写的
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
不好意思,我把帖子给结了。。吃饭回来给你转些分数吧。。
warrior 2008-10-15
  • 打赏
  • 举报
回复
用递归写了一个:

namespace consoleapp
{
class Program
{
static void Main(string[] args)
{
var l = Combine("abcde", 4);
foreach (char[] ca in l)
{
Console.WriteLine(new string(ca));

};
Console.ReadLine();
}

private static List<char[]> Combine(string s,int count)
{
List<char[]> l = new List<char[]>();
if (count == 1)
{
foreach (char c in s)
{
char[] ca = new char[1];
ca[0] = c;
l.Add(ca);
};
}
else
{
for (int i = 0; i < s.Length; i++)
{
List<char[]> lsub;
if (s.Length - 1 >= count - 1)
{
lsub = Combine(s.Substring(i + 1), count - 1);

foreach (char[] a in lsub)
{
char[] ca = new char[count];
a.CopyTo(ca, 0);
ca[count - 1] = s[i];
l.Add(ca);
};
};

};
};
return l;
}
}
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
谢谢!

结帖去喽!
wartim 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wsyskyhorse 的回复:]
LS的,只组合,不排列;囧
[/Quote]

额。。。那这样

namespace WindowsApplication9
{
public partial class Form1 : Form
{
String Result = String.Empty;
int Count = 3;
public Form1()
{
String S = "ABCDEFGH";
String TempResult = String.Empty;
int TempCount = Count;
GetIt(S, Count, ref TempResult);
MessageBox.Show(Result);
}

void GetIt(String S, int TempCount, ref String TempResult)
{
if (TempCount == 0)
{
String[] Results=Result.Split(' ');
for (int i = 0; i < Results.Length; i++)
{
bool IsHad = true;
for (int j = 0; j < Count; j++)
IsHad = IsHad && Results[i].IndexOf(TempResult[j]) >= 0;
if (IsHad)
return;
}
Result += TempResult + " ";
return;
}
for (int i = 0; i < S.Length; i++)
{
String C = S.Substring(i, 1);
String T = S.Remove(i, 1);
TempResult += C;
GetIt(T, TempCount - 1, ref TempResult);
TempResult = TempResult.Remove(TempResult.Length - 1, 1);
}
}
}
}


输出结果:
ABC ABD ABE ABF ABG ABH ACD ACE ACF ACG ACH ADE ADF ADG ADH AEF AEG AEH AFG AFH AGH BCD BCE BCF BCG BCH BDE BDF BDG BDH BEF BEG BEH BFG BFH BGH CDE CDF CDG CDH CEF CEG CEH CFG CFH CGH DEF DEG DEH DFG DFH DGH EFG EFH EGH FGH
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wartim 的回复:]
C# code
namespace WindowsApplication9
{
public partial class Form1 : Form
{
String Result = String.Empty;
public Form1()
{
String S = "ABCDEFGH";
int Count = 3;
String TempResult = String.Empty;
GetIt(S, Count, ref TempResult);
MessageBox.Show(Result);
}

void GetIt(String S…
[/Quote]

漂亮!只是输出的是全排列,而非全组合
wsyskyhorse 2008-10-15
  • 打赏
  • 举报
回复
LS的,只组合,不排列;囧
wartim 2008-10-15
  • 打赏
  • 举报
回复

namespace WindowsApplication9
{
public partial class Form1 : Form
{
String Result = String.Empty;
public Form1()
{
String S = "ABCDEFGH";
int Count = 3;
String TempResult = String.Empty;
GetIt(S, Count, ref TempResult);
MessageBox.Show(Result);
}

void GetIt(String S, int Count, ref String TempResult)
{
if (Count == 0)
{
Result += TempResult + " ";
return;
}
for (int i = 0; i < S.Length; i++)
{
String C = S.Substring(i, 1);
String T = S.Remove(i, 1);
TempResult += C;
GetIt(T, Count - 1, ref TempResult);
TempResult = TempResult.Remove(TempResult.Length - 1, 1);
}
}
}
}


输出结果:
ABC ABD ABE ABF ABG ABH ACB ACD ACE ACF ACG ACH ADB ADC ADE ADF ADG ADH AEB AEC AED AEF AEG AEH AFB AFC AFD AFE AFG AFH AGB AGC AGD AGE AGF AGH AHB AHC AHD AHE AHF AHG BAC BAD BAE BAF BAG BAH BCA BCD BCE BCF BCG BCH BDA BDC BDE BDF BDG BDH BEA BEC BED BEF BEG BEH BFA BFC BFD BFE BFG BFH BGA BGC BGD BGE BGF BGH BHA BHC BHD BHE BHF BHG CAB CAD CAE CAF CAG CAH CBA CBD CBE CBF CBG CBH CDA CDB CDE CDF CDG CDH CEA CEB CED CEF CEG CEH CFA CFB CFD CFE CFG CFH CGA CGB CGD CGE CGF CGH CHA CHB CHD CHE CHF CHG DAB DAC DAE DAF DAG DAH DBA DBC DBE DBF DBG DBH DCA DCB DCE DCF DCG DCH DEA DEB DEC DEF DEG DEH DFA DFB DFC DFE DFG DFH DGA DGB DGC DGE DGF DGH DHA DHB DHC DHE DHF DHG EAB EAC EAD EAF EAG EAH EBA EBC EBD EBF EBG EBH ECA ECB ECD ECF ECG ECH EDA EDB EDC EDF EDG EDH EFA EFB EFC EFD EFG EFH EGA EGB EGC EGD EGF EGH EHA EHB EHC EHD EHF EHG FAB FAC FAD FAE FAG FAH FBA FBC FBD FBE FBG FBH FCA FCB FCD FCE FCG FCH FDA FDB FDC FDE FDG FDH FEA FEB FEC FED FEG FEH FGA FGB FGC FGD FGE FGH FHA FHB FHC FHD FHE FHG GAB GAC GAD GAE GAF GAH GBA GBC GBD GBE GBF GBH GCA GCB GCD GCE GCF GCH GDA GDB GDC GDE GDF GDH GEA GEB GEC GED GEF GEH GFA GFB GFC GFD GFE GFH GHA GHB GHC GHD GHE GHF HAB HAC HAD HAE HAF HAG HBA HBC HBD HBE HBF HBG HCA HCB HCD HCE HCF HCG HDA HDB HDC HDE HDF HDG HEA HEB HEC HED HEF HEG HFA HFB HFC HFD HFE HFG HGA HGB HGC HGD HGE HGF
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 nattystyle 的回复:]
引用 4 楼 min_jie 的回复:
举个例子吧:
string str="ABCDEFG";
int count=3;
调用Combining(str,count)得到所有可能的组合,如:ABC,ABD,ABE,ABF……


这个题目不清不楚的,什么叫“任意提取出”,如果这样可以,CBA,BAD,EBA,FBA……也有可能?

那不就是全排列么
[/Quote]

我不是说了不用排列吗?意思就是CBA跟ABC是一样的。。无需重复。。
yagebu1983 2008-10-15
  • 打赏
  • 举报
回复
用随机数吗?
real_name 2008-10-15
  • 打赏
  • 举报
回复
顶。。。
nattystyle 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 min_jie 的回复:]
举个例子吧:
string str="ABCDEFG";
int count=3;
调用Combining(str,count)得到所有可能的组合,如:ABC,ABD,ABE,ABF……
[/Quote]

这个题目不清不楚的,什么叫“任意提取出”,如果这样可以,CBA,BAD,EBA,FBA……也有可能?

那不就是全排列么
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wsyskyhorse 的回复:]
任意提取出count个进行组合。不用排列。str的长度大于等于count
好像题意有问题


string str="ABCDEFG";
int count=3;

如果是这样,符合的组合是不是也包括,ABCD,ABCDE...等等呢
你前面有说“str的长度大于等于count”
[/Quote]

不是,只是包括:ABC、BCD这样的,我说的“str的长度大于等于count”,是强调一下可以从str取到count个字符。
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nattystyle 的回复:]
按LZ的要求,测试通过


C# codeclass Program
{
static void Main(string[] args)
{
Combining("58fgj6nsz",5);
}
static void Combining(string str, int count)
//str中没有重复字符,要求将str中的字符任意提取出count个进行组合。不用排列。str的长度大于等于count。
{
string res = "";
if (str.Length < count) return;
Random r = new Random()…
[/Quote]

可能是我没说清楚。。我要的结果是所有的组合。。如Combining("ABC",2)就要得到AB、AC、BC。
Combining("ABCD",3)就要得到:ABC、ABD、ACD、BCD

如果只是任意取一个,那就太简单了。。
falx2004 2008-10-15
  • 打赏
  • 举报
回复
楼上的只取出来一种组合
需要多一次循环...
nattystyle 2008-10-15
  • 打赏
  • 举报
回复
需求突变!

那叫全组合,而不叫组合

//str中没有重复字符,要求将str中的字符任意提取出count个进行组合。不用排列。str的长度大于等于count。

少个全字
wsyskyhorse 2008-10-15
  • 打赏
  • 举报
回复
任意提取出count个进行组合。不用排列。str的长度大于等于count
好像题意有问题


string str="ABCDEFG";
int count=3;

如果是这样,符合的组合是不是也包括,ABCD,ABCDE...等等呢
你前面有说“str的长度大于等于count”
nattystyle 2008-10-15
  • 打赏
  • 举报
回复
按LZ的要求,测试通过

class Program
{
static void Main(string[] args)
{
Combining("58fgj6nsz",5);
}
static void Combining(string str, int count)
//str中没有重复字符,要求将str中的字符任意提取出count个进行组合。不用排列。str的长度大于等于count。
{
string res = "";
if (str.Length < count) return;
Random r = new Random();
while (res.Length != count)
{
string t = str[r.Next(str.Length)].ToString();
if (!res.Contains(t.ToString()))
res += t;
}
Console.WriteLine(res);
}
}


看看我能得几分 n_n
止戈而立 2008-10-15
  • 打赏
  • 举报
回复
举个例子吧:
string str="ABCDEFG";
int count=3;
调用Combining(str,count)得到所有可能的组合,如:ABC,ABD,ABE,ABF……
加载更多回复(3)

110,547

社区成员

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

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

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