2017-08-09 102 views
-1

我正在尝试使用排序集来解决运行中值问题(在hackerrank上)。只有它的元素没有正确排序。为什么不能使用SortedSet作为优先级队列或Min-Heap?

看到它在这里的行动:http://rextester.com/NGBN25779

public class RunningMedian{ 

    List<int> list = new List<int>(); 
    SortedSet<int> sorted = new SortedSet<int>(); 

    public void Add(int num){ 
     list.Add(num); 
     sorted.Add(num); 
    } 
    public double MedianNotWorking(){ 
     return GetMedian(sorted.ToArray()); 
    } 
    public double MedianWorking(){ 
     int[] arr = list.ToArray(); 
     Array.Sort(arr); 
     return GetMedian(arr); 
    } 
    public double GetMedian(int[] arr){ 
     int idx = list.Count/2; 
     if(arr.Length % 2 == 0){ 
      return (double)((double)(arr[idx] + arr[idx-1])/2); 
     }else{ 
      return arr[idx]; 
     } 
    } 

} 

static void Main(String[] args) { 
    int n = Convert.ToInt32(Console.ReadLine()); 
    int[] a = new int[n]; 

    RunningMedian heap = new RunningMedian(); 
    for(int i = 0; i < n; i++){ 
     a[i] = Convert.ToInt32(Console.ReadLine()); 
     heap.Add(a[i]); 

     //double median = heap.GetMedian(); 
     double median = heap.MedianNotWorking(); 
     Console.WriteLine(median.ToString("F1")); 
    } 
} 

对于有序集合不工作的大部分。然而,在较大的输入尺寸下,它开始给出错误的答案。这可能不是问题的最佳解决方案,但我很好奇它为什么失败。 C#没有min-heap/priority队列,那么为什么不能使用排序的集合作为替代?

*编辑为包含hackerrank的完整代码。

这是一个输入文件。 输入 http://textuploader.com/dovni

预期 http://textuploader.com/dovnb

输出 http://textuploader.com/dovwj

冲突出现近终点

预期 (跳过1-364) 54240.0 54576.5 54913.0 54576.5 54240.0

结果 (跳过1-364) 54240.0 54576.5 54913.0 54963.0 54576.5

+1

对于哪个输入值示例代码失败?请编辑您的问题以包含使用您的RunningMedian类的代码,以便我们可以看到(并尝试)为什么失败。 – Progman

+0

已更新,其中包含完整的代码,输入,输出和预期。 – Boyd

回答

1

SortedSet集合根据定义仅唯一值包含。但是,您的输入文件包含数字21794两次,这意味着第二个21794条目不会被添加到您的SortedSet。所以你的排序集将包含比你的列表更少的值,你的整个算法不再工作。