[Homework] Algorithms - Sorting and Searching - Problem 2
Здравейте,
стигнах до задача 2 от домашното: Implement Interpolation Search
Използвайки псевдо кодове които намерих из нета a и този който е в слайдовете, успявам да го докарам до работещ вариант, когато колекцията е от числа.
Но как да стане когато елемента който търсим е от тип Т и няма как да намеря Mid позицията по формулата:
int mid = low + ((needle - list[low]) * (high - low)) / (list[high] - list[low]);
тъй като няма как от нещо което незнам какво е да извадя число
Харесва ми идеята - ще я използвам в домашаното си :)
Благодаря ти!
Интересна идея, цяла вечер мислих върху нея снощи, но удрям до следния проблем. Ако T -то в Sortable Collection имплементира Interpolatable, то цялата колекция не може да работи с примитвни числови типове (int, double, long и т.н.) защото те не имплементират интерфейса. Ако пък обратно се опиташ да зададеш че само T то в методът е Interpolatable, то не може да го сравниш със Т то на SortableCollection, защото нито едно от тях не имплементира IComparable със другото (а са 2 различни generic-а вече - едното е Interpolatable, другото не е), дори и да му зададеш че е IComparable със другото Т (което е доста измислено, защото значи че всеки клас който е interpolatable, ще знае как да се сравнява със всеки generic клас, който могат да му подадат), то удряш друг проблем как подаваш на овърлоуднатият метод InterpolateSearch<T>(IList<T> list, T needle) where T: IComparable<T>, Interpolatable<T>
колекцията с която ще работи. Колекцията очевидно трябва да е this.Items но обектите в Items не имплементират Interpolatable и съответно колекцията не може да бъде подадена към методът. За жалост се оказва че не може да има овърлоуди на оператори в интерфейс, иначе работата щеше да е бая по лесна.
Та в крайна сметка разбрах че само int-ове ще са, но да прекастваме всеки елемент към инт в методът изглежда като бая лоша практика, някой измислил ли е по елегантно решение на проблема?
Ами, единия метод приема List<int>, int needle, другия List<T>, T needle. Лесно се разграничават двата. Проблемите идват от класа, който наистина е ограничен.