किसी विशेष कारण से मैंने एक एल्गोरिदम की तलाश करने का निर्णय लिया जो 1 के बीच के पूर्णांक के सभी संभावित विकल्पों का उत्पादन करता है ... n, जहां के पूर्णांक के बीच आदेश कोई फर्क नहीं पड़ता है (एन चुनें k चीज़y)।1 के बीच के पूर्णांक के सभी संभावित संयोजनों को सूचीबद्ध करें ... n (n चुनें k)
इसी कारण से, जिसका कोई कारण नहीं है, मैंने इसे सी # में भी लागू किया। मेरा सवाल है:
क्या आपको मेरे एल्गोरिदम या कोड में कोई गलती दिखाई देती है? और, सबसे महत्वपूर्ण बात यह है कि क्या आप बेहतर एल्गोरिदम सुझा सकते हैं?
कृपया कोड की तुलना में एल्गोरिदम पर अधिक ध्यान दें। यह सबसे सुंदर कोड नहीं है जिसे मैंने कभी लिखा है, हालांकि बताएं कि क्या आपको कोई त्रुटि दिखाई दे रही है।
संपादित करें: Alogirthm समझाया -
- हम कश्मीर सूचकांक पकड़ो।
- यह को लूप के लिए बनाता है, जहां लूप i इंडेक्स सूचकांक है [i]।
- यह लूप के लिए अनुकरण करता है जहां सूचकांक [i + 1] सूचकांक के लूप के भीतर घोंसला वाले लूप से संबंधित है [i]।
- सूचकांक [i] सूचकांक [i - 1] से चलाता है + 1 n करने के लिए - k + मैं + 1.
कोड:
public class AllPossibleCombination
{
int n, k;
int[] indices;
List<int[]> combinations = null;
public AllPossibleCombination(int n_, int k_)
{
if (n_ <= 0)
{
throw new ArgumentException("n_ must be in N+");
}
if (k_ <= 0)
{
throw new ArgumentException("k_ must be in N+");
}
if (k_ > n_)
{
throw new ArgumentException("k_ can be at most n_");
}
n = n_;
k = k_;
indices = new int[k];
indices[0] = 1;
}
/// <summary>
/// Returns all possible k combination of 0..n-1
/// </summary>
/// <returns></returns>
public List<int[]> GetCombinations()
{
if (combinations == null)
{
combinations = new List<int[]>();
Iterate(0);
}
return combinations;
}
private void Iterate(int ii)
{
//
// Initialize
//
if (ii > 0)
{
indices[ii] = indices[ii - 1] + 1;
}
for (; indices[ii] <= (n - k + ii + 1); indices[ii]++)
{
if (ii < k - 1)
{
Iterate(ii + 1);
}
else
{
int[] combination = new int[k];
indices.CopyTo(combination, 0);
combinations.Add(combination);
}
}
}
}
मैं लंबे समय से प्रश्न के लिए क्षमा चाहते हैं, यह हो सकता है ब्लॉग पोस्ट के लिए उपयुक्त रहें, लेकिन मैं यहां समुदाय की राय चाहता हूं।
main(n,k){float t=0,r=1;for(scanf("%d, %d",&n,&k);t++<k;r*=(1+n-t)/t);printf("%.0f\n",r);}
ठीक है ... पठनीय संस्करण:
धन्यवाद,
आसफ
डुप्लिकेट: // रों tackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n – ShreevatsaR