इसे Topological Sort एल्गोरिदम के साथ हल किया जा सकता है।
यदि आप अपने प्रत्येक इनपुट अनुक्रमों को निर्देशित ग्राफ के माध्यम से पथ मानते हैं, तो एक स्थलीय प्रकार आपके नोड्स के सेट को बाएं से दाएं से क्रमबद्ध करेगा ताकि प्रत्येक निर्देशित किनारे दाईं ओर इंगित हो। ![Diagram of a directed graph after topological sorting](https://i.stack.imgur.com/CQzOi.png)
Topological Sorting पर विकिपीडिया पृष्ठ इस एल्गोरिथ्म, पहले 1962 में आर्थर क्हान द्वारा वर्णित शामिल हैं:
L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
remove a node n from S
insert n into L
for each node m with an edge e from n to m do
remove edge e from the graph
if m has no other incoming edges then
insert m into S
if graph has edges then
return error (graph has at least one cycle)
else
return L (a topologically sorted order)
इस एल्गोरिथ्म, लिखित रूप में, वास्तव में अगर यह अस्पष्ट दृश्यों पाता असफल नहीं है, लेकिन इतना आसान है इस तरह, पाश की शुरुआत में एक चेक डालने से जोड़ने के लिए:
...
while S is non-empty do
if S contains more than 1 item
return error (inputs are ambiguous)
remove a node n from S
...
मैं आप किस भाषा में काम कर रहे हैं पता नहीं है, लेकिन मैं एक साथ एक सबूत के रूप में इस पीएचपी कार्यान्वयन फेंक दिया गया है अवधारणा के:
function mergeSequences($sequences, $detectAmbiguity = false) {
// build a list of nodes, with each node recording a list of all incoming edges
$nodes = array();
foreach ($sequences as $seq) {
foreach ($seq as $i => $item) {
if (!isset($nodes[$item])) $nodes[$item] = array();
if ($i !== 0) {
$nodes[$item][] = $seq[$i-1];
}
}
}
// build a list of all nodes with no incoming edges
$avail = array();
foreach ($nodes as $item => $edges) {
if (count($edges) == 0) {
$avail[] = $item;
unset($nodes[$item]);
}
}
$sorted = array();
$curr = '(start)';
while (count($avail) > 0) {
// optional: check for ambiguous sequence
if ($detectAmbiguity && count($avail) > 1) {
throw new Exception("Ambiguous sequence: {$curr} can be followed by " . join(' or ', $avail));
}
// get the next item and add it to the sorted list
$curr = array_pop($avail);
$sorted[] = $curr;
// remove all edges from the currently selected items to all others
foreach ($nodes as $item => $edges) {
$nodes[$item] = array_diff($edges, array($curr));
if (count($nodes[$item]) == 0) {
$avail[] = $item;
unset($nodes[$item]);
}
}
}
if (count($nodes) > 0) {
throw new Exception('Sequences contain conflicting information. Cannot continue after: ' . join(', ', $sorted));
}
return $sorted;
}
आप इस तरह फ़ंक्शन को कॉल कर सकते हैं:
$input = array(
array('XS', 'M', 'L', 'XL'),
array('S', 'M', 'XXL'),
array('XXS', 'XS', 'S', 'L'),
);
echo(join(', ', mergeSequences($input)));
echo(join(', ', mergeSequences($input, true)));
निम्नलिखित उत्पादन प्राप्त करने के लिए:
XXS, XS, S, M, XXL, L, XL
Uncaught exception 'Exception' with message 'Ambiguous sequence: M can be followed by L or XXL'
मुझे समझ में नहीं आता कि प्राथमिकता नियम अज्ञात हैं तो आप सूचियों को कैसे विलय कर सकते हैं। –
@ टायलर डर्डन मैंने आशा व्यक्त करने के लिए प्रश्न को संपादित किया है कि यह थोड़ा स्पष्ट हो। क्या उससे मदद हुई? – jcsanyi
नहीं, यह कैसे तय किया जाता है कि आप एक्सएक्सएल एल और एक्सएल के सापेक्ष कहां हैं? –