Где здесь квадратичная сложность?
Дана задача. Нужно реализовать сериализацию и десериализацию связного списка. Сложность алгоритма должна быть не выше квадратичной. Ниже приведен код решения, проверяющие говорят что сложность алгоритма квадратична, но я не могу понять где именно. По идее в методах Serialize() и Deserialize() однократный проход по массивам, вложенных циклов нет, я делаю вывод, что сложность линейно зависит от количества входных данных. Или я чего то не понимаю?
class ListNode
{
public ListNode Prev;
public ListNode Next;
public ListNode Rand; // произвольный элемент внутри списка
public string Data;
}
class ListRand
{
public ListNode Head;
public ListNode Tail;
public int Count;
public void Serialize(FileStream s)
{
List<ListNode> arr = new List<ListNode>();
ListNode temp = new ListNode();
temp = Head;
//transform nodes into List
do
{
arr.Add(temp);
temp = temp.Next;
} while (temp != null);
//write into file; data is modify for store index of .Random node
using (StreamWriter w = new StreamWriter(s))
foreach (ListNode n in arr)
w.WriteLine(n.Data.ToString() + ":" + arr.IndexOf(n.Rand).ToString());
}
public void Deserialize(FileStream s)
{
List<ListNode> arr = new List<ListNode>();
ListNode temp = new ListNode();
Count = 0;
Head = temp;
string line;
//try read file and create List of nodes
try
{
using (StreamReader sr = new StreamReader(s))
{
while ((line = sr.ReadLine()) != null)
{
if (!line.Equals(""))
{
Count++;
temp.Data = line;
ListNode next = new ListNode();
temp.Next = next;
arr.Add(temp);
next.Prev = temp;
temp = next;
}
}
}
//declare Tail
Tail = temp.Prev;
Tail.Next = null;
//return refs to Random nodes and restore Data
foreach (ListNode n in arr)
{
n.Rand = arr[Convert.ToInt32(n.Data.Split(':')[1])];
n.Data = n.Data.Split(':')[0];
}
}
catch (Exception e)
{
Console.WriteLine("Failed to process data file, possibly it's corrupt, details:");
Console.WriteLine(e.Message);
Console.WriteLine("Press Enter to exit.");
Console.Read();
Environment.Exit(0);
}
}
}
Ответы (1 шт):
Автор решения: Qwertiy
→ Ссылка
foreach (ListNode n in arr) // первый проход
arr.IndexOf(n.Rand) // вложенный проход