C# List, ¹è¿Àº BinarySearch¸¦ Áö¿øÇÑ´Ù. BinarySearch¸¦ ÇϱâÀü¿¡ Á¤·ÄÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. using System;
using System.Collections.Generic; class Test { public void Run() { List<string> l = new List<string>(); l.Add("acorn"); // 0 l.Add("apple"); // 1 l.Add("banana"); // 2 l.Add("cantaloupe"); // 3 l.Add("lettuce"); // 4 l.Add("onion"); // 5 l.Add("peach"); // 6 l.Add("pepper"); // 7 l.Add("squash"); // 8 l.Add("tangerine"); // 9 int i = l.BinarySearch("peach"); Console.WriteLine(i); i = l.BinarySearch("banana"); Console.WriteLine(i); i = l.BinarySearch("apple"); Console.WriteLine(i); i = l.BinarySearch("abstract"); Console.WriteLine(i + " complement ==> " + ~i); i = l.BinarySearch("assume"); Console.WriteLine( i + " complement ==> " + ~i); } } ½ÇÇà °á°ú) 6 2 1 -1 complement ==> 0 -3 complement ==> 2 °Ë»ö °á°ú°¡ 0º¸´Ù ÀÛÀ¸¸é °ªÀÌ Á¸ÀçÇÏÁö ¾ÊÀ»¶§ÀÌ´Ù. "~" º¸¼ö·Î ¹Ù²Ù¸é °á°ú°ªÀÌ µé¾î°¡¾ß ÇÒ À§Ä¡ÀÌ´Ù. "abstract"ÀÇ °á°ú°ªÀº -1 º¸¼ö´Â 0ÀÌ´Ù. "assume"ÀÇ °á°ú°ªÀº -3 º¸¼ö´Â 2ÀÌ´Ù. IComparer¸¦ ÀÌ¿ëÇÏ¿© Ä¿½ºÅÒ ºñ±³ ÇÔ¼ö¸¦ ¸¸µé¼öµµ ÀÖ´Ù. ¾Æ·¡´Â Start¿Í End°ª¿¡ Æ÷ÇԵǴ À妽º¸¦ ã´Â ¿¹Á¦ÀÌ´Ù. ÁÖÀÇ»çÇ×) List.BinarySearch¸¦ ½ÇÇà ÇßÀ» ¶§ Compare(lhs, rhs )·Î ³Ñ¾î¿À´Â °ªÀÌ ¸ð³ë C#°ú À©µµ¿ìÁî C#ÀÌ ´Ù¸£´Ù. BinarySearch Item ºñ±³°ªÀÌ Compare( ) ÇÔ¼ö·Î ³Ñ¾î¿Ã¶§ À¯´ÏƼ C#¿¡¼´Â LHS, MS À©µµ¿ìÁî C#¿¡¼´Â RHSÀÌ´Ù. À¯´ÏƼ C#¿¡¼´Â this.End°¡ -1ÀÌ´Ù. MS À©µµ¿ìÁî C#¿¡¼´Â other.End°¡ -1ÀÌ´Ù. Ç÷§Æû¿¡ µû¶ó ¹üÀ§ ¾È¿¡ Æ÷ÇԵǴÂÁö üũ¸¦ ´Þ¸® ÇØ¾ß ÇÑ´Ù. BinarySearch¿¡¼ ³Ñ°ÜÁÖ´Â itemÀÇ( Range )ÀÇ End °ªÀÌ -1À» ºñ±³°ªÀ¸·Î Á¤ÇÑ´Ù. using System;
using System.Collections.Generic; public class Range { public int Start { get; set; } public int End { get; set; } public Range( int start, int end) { Start = start; End = end; } public int Comp(Range other) { //BinarySearch Item ºñ±³°ªÀÌ Compare( ) ÇÔ¼ö·Î ³Ñ¾î¿Ã¶§ //À¯´ÏƼ C#¿¡¼´Â LHS, MS À©µµ¿ìÁî C#¿¡¼´Â RHSÀÌ´Ù. if (other.End == -1) { int v = other.Start; if (v >= Start && v <= End) return 0; } else { int v = Start; if (v >= other.Start && v <= other.End) return 0; } int val = other.Start; if (Start > val) return 1; else if (Start < val) return -1; else return 0; } } public class RangeComparer : IComparer<Range> { public int Compare(Range x, Range y) { return x.Comp(y); } } class Test { public void Run() { List<Range> list = new List<Range>(); list.Add(new Range(1, 10)); list.Add(new Range(20, 100)); list.Add(new Range(300, 1000)); list.Add(new Range(4000, 10000)); list.Add(new Range(50000, 60000)); RangeComparer rangeComparer = new RangeComparer(); int index = list.BinarySearch(0, 5, new Range(10, -1), rangeComparer); Console.WriteLine(index); index = list.BinarySearch(new Range(21, -1), rangeComparer); Console.WriteLine(index); index = list.BinarySearch(new Range(301, -1), rangeComparer); Console.WriteLine(index); index = list.BinarySearch(new Range(10000, -1), rangeComparer); Console.WriteLine(index); index = list.BinarySearch(new Range(50001, -1), rangeComparer); Console.WriteLine(index); } } ½ÇÇà°á°ú) 0 1 2 3 4 ÂüÁ¶) https://www.dotnetperls.com/binarysearch |