Задачи для IT интервью
- Aleksey Kudinov
- Уже с Приветом
- Сообщения: 2169
- Зарегистрирован: Вс мар 09, 2003 11:28 pm
- Откуда: Houston, TX
Re: Задачи для IT интервью
Вам тут высокие материи всё, а я сегодня из МБА претендующего на роль бизнес аналитика не смог вытянуть что есть internal rate of return. Кто знает, тот поймёт. А present value of $30 2 years from now at a 10% discount rate у него получилось $24... Рукалицо.
- liamkin
- Уже с Приветом
- Сообщения: 2648
- Зарегистрирован: Чт июн 19, 2003 3:22 pm
- Откуда: USA
- valchkou
- Уже с Приветом
- Сообщения: 4195
- Зарегистрирован: Вт апр 26, 2011 10:43 pm
- Откуда: Сергели ->Chicago
- Контактная информация:
Re: Задачи для IT интервью
кривые квадратики каждый рисовать умеет.
МоржСорт имплементед:
https://github.com/valchkou/JavaSnippet ... eSort.java
МоржСорт имплементед:
https://github.com/valchkou/JavaSnippet ... eSort.java
-
- Уже с Приветом
- Сообщения: 2761
- Зарегистрирован: Сб июл 11, 2015 2:01 pm
- Откуда: Chicago
Re: Задачи для IT интервью
Не знаю, приветствуется ли код ревью, но читать (a<=b) вместо (a <= b) лично мне тяжело, также и с плюсами, особенно когда стиль пляшет то первый вариант, то второй. Есть пару ошибок в комментах к коду.valchkou писал(а): Пн июл 08, 2019 10:17 pm кривые квадратики каждый рисовать умеет.
МоржСорт имплементед:
https://github.com/valchkou/JavaSnippet ... eSort.java
Ну и for(int k=0; k < arr.lenght(); k++) { print arr[k] } вместо for(int element in arr) { print element } вообще тут уже обсуждалось.
- valchkou
- Уже с Приветом
- Сообщения: 4195
- Зарегистрирован: Вт апр 26, 2011 10:43 pm
- Откуда: Сергели ->Chicago
- Контактная информация:
Re: Задачи для IT интервью
комментарии конечно приветствуются, я этот код лет 6 назад написал судя по гитхабу.nyekimov писал(а): Пн июл 08, 2019 11:54 pmНе знаю, приветствуется ли код ревью, но читать (a<=b) вместо (a <= b) лично мне тяжело, также и с плюсами, особенно когда стиль пляшет то первый вариант, то второй. Есть пару ошибок в комментах к коду.valchkou писал(а): Пн июл 08, 2019 10:17 pm кривые квадратики каждый рисовать умеет.
МоржСорт имплементед:
https://github.com/valchkou/JavaSnippet ... eSort.java
Ну и for(int k=0; k < arr.lenght(); k++) { print arr[k] } вместо for(int element in arr) { print element } вообще тут уже обсуждалось.
Но честно сказать ты первый кто удосужился прокомментировать, а может даже и просмотреть.
И даже мне он кажется каким то странным.
Но суть не в этом, а в том что написать работающий сортморж намного сложнее чем вот то виде с доской и квадратиками.
- John Smith
- Уже с Приветом
- Сообщения: 1681
- Зарегистрирован: Ср окт 04, 2006 6:30 pm
- Откуда: Las Vegas
Re: Задачи для IT интервью
для быстрой сортировки int[] - radix sort - выбор мастеров, быстрее стандартного джавского Arrays.sort() в 3 раза
-
- Уже с Приветом
- Сообщения: 143
- Зарегистрирован: Вт апр 29, 2014 7:22 am
Re: Задачи для IT интервью
На современных языках с их синтаксическим сахаром, подобное пишется быстро и строчек в 30. Без всяких досок и квадратиков.valchkou писал(а): Вт июл 09, 2019 12:40 am
Но суть не в этом, а в том что написать работающий сортморж намного сложнее чем вот то виде с доской и квадратиками.
Код: Выделить всё
public func mergeSort<Element>(_ array: [Element]) -> [Element] where Element: Comparable {
guard array.count > 1 else { return array }
let middle = array.count / 2
let left = mergeSort(Array(array[..<middle]))
let right = mergeSort(Array(array[middle...]))
return merge(left, right)
}
private func merge<Element>(_ left: [Element], _ right: [Element]) -> [Element] where Element: Comparable {
var leftIndex = 0
var rightIndex = 0
var result: [Element] = []
while leftIndex < left.count && rightIndex < right.count {
let leftElement = left[leftIndex]
let rightElement = right[rightIndex]
if leftElement < rightElement {
result.append(leftElement)
leftIndex += 1
} else if leftElement > rightElement {
result.append(rightElement)
rightIndex += 1
} else {
result.append(leftElement)
leftIndex += 1
result.append(rightElement)
rightIndex += 1
}
}
if leftIndex < left.count {
result.append(contentsOf: left[leftIndex...])
}
if rightIndex < right.count {
result.append(contentsOf: right[rightIndex...])
}
return result
}
- John Smith
- Уже с Приветом
- Сообщения: 1681
- Зарегистрирован: Ср окт 04, 2006 6:30 pm
- Откуда: Las Vegas
Re: Задачи для IT интервью
каков cost result.append() ? сдается мне что эта реализация будет за O(n^2) работатьfleshold писал(а): Вт июл 09, 2019 12:54 pmНа современных языках с их синтаксическим сахаром, подобное пишется быстро и строчек в 30. Без всяких досок и квадратиков.valchkou писал(а): Вт июл 09, 2019 12:40 am
Но суть не в этом, а в том что написать работающий сортморж намного сложнее чем вот то виде с доской и квадратиками.Код: Выделить всё
public func mergeSort<Element>(_ array: [Element]) -> [Element] where Element: Comparable { guard array.count > 1 else { return array } let middle = array.count / 2 let left = mergeSort(Array(array[..<middle])) let right = mergeSort(Array(array[middle...])) return merge(left, right) } private func merge<Element>(_ left: [Element], _ right: [Element]) -> [Element] where Element: Comparable { var leftIndex = 0 var rightIndex = 0 var result: [Element] = [] while leftIndex < left.count && rightIndex < right.count { let leftElement = left[leftIndex] let rightElement = right[rightIndex] if leftElement < rightElement { result.append(leftElement) leftIndex += 1 } else if leftElement > rightElement { result.append(rightElement) rightIndex += 1 } else { result.append(leftElement) leftIndex += 1 result.append(rightElement) rightIndex += 1 } } if leftIndex < left.count { result.append(contentsOf: left[leftIndex...]) } if rightIndex < right.count { result.append(contentsOf: right[rightIndex...]) } return result }
- liamkin
- Уже с Приветом
- Сообщения: 2648
- Зарегистрирован: Чт июн 19, 2003 3:22 pm
- Откуда: USA
- valchkou
- Уже с Приветом
- Сообщения: 4195
- Зарегистрирован: Вт апр 26, 2011 10:43 pm
- Откуда: Сергели ->Chicago
- Контактная информация:
Re: Задачи для IT интервью
А можно попросить ваш современный код отсортировать 1 млн интегеров и замерить время.
Ради интереса, что оптимизирует сахар под капотом. Думаю что в контексте данного теста железо не так важно
но если что у меня mac intel i7, количество памяти и коров значение не имеют
Что то вроде такого.
мой сорт занял 15 сек что очень долго
к слову родной ява сорт занимает всего 250 mls для 1mln
Ради интереса, что оптимизирует сахар под капотом. Думаю что в контексте данного теста железо не так важно
но если что у меня mac intel i7, количество памяти и коров значение не имеют
Что то вроде такого.
Код: Выделить всё
int max = 1000000;
int[] arr = new int[max];
for (int i = 0; i<max; i++) {
arr[i] = ThreadLocalRandom.current().nextInt(max);
}
long t = System.currentTimeMillis();
sort(arr);
System.out.println(System.currentTimeMillis() - t);
к слову родной ява сорт занимает всего 250 mls для 1mln
Код: Выделить всё
int[] sorted = IntStream.of(arr).sorted().toArray();
fleshold писал(а): Вт июл 09, 2019 12:54 pm На современных языках с их синтаксическим сахаром, подобное пишется быстро и строчек в 30. Без всяких досок и квадратиков.Код: Выделить всё
public func mergeSort<Element>(_ array: [Element]) -> [Element] where Element: Comparable { guard array.count > 1 else { return array } let middle = array.count / 2 let left = mergeSort(Array(array[..<middle])) let right = mergeSort(Array(array[middle...])) return merge(left, right) } private func merge<Element>(_ left: [Element], _ right: [Element]) -> [Element] where Element: Comparable { var leftIndex = 0 var rightIndex = 0 var result: [Element] = [] while leftIndex < left.count && rightIndex < right.count { let leftElement = left[leftIndex] let rightElement = right[rightIndex] if leftElement < rightElement { result.append(leftElement) leftIndex += 1 } else if leftElement > rightElement { result.append(rightElement) rightIndex += 1 } else { result.append(leftElement) leftIndex += 1 result.append(rightElement) rightIndex += 1 } } if leftIndex < left.count { result.append(contentsOf: left[leftIndex...]) } if rightIndex < right.count { result.append(contentsOf: right[rightIndex...]) } return result }
Последний раз редактировалось valchkou Вт июл 09, 2019 3:11 pm, всего редактировалось 1 раз.
- valchkou
- Уже с Приветом
- Сообщения: 4195
- Зарегистрирован: Вт апр 26, 2011 10:43 pm
- Откуда: Сергели ->Chicago
- Контактная информация:
Re: Задачи для IT интервью
наверное если бы он был самым быстрым то не стали бы придумывать ничего другого.
ява использует аналог тимсорт
https://en.wikipedia.org/wiki/Timsort
- liamkin
- Уже с Приветом
- Сообщения: 2648
- Зарегистрирован: Чт июн 19, 2003 3:22 pm
- Откуда: USA
Re: Задачи для IT интервью
Кроме скорости, есть другие причины выдумывать собственные сортировки. Мозги-то шевелятся, шарики-то крутятся. Вот в поиске простых чисел придумано ли что-то лучше Евклидова сита?valchkou писал(а): Вт июл 09, 2019 3:11 pmнаверное если бы он был самым быстрым то не стали бы придумывать ничего другого.
ява использует аналог тимсорт
https://en.wikipedia.org/wiki/Timsort
- John Smith
- Уже с Приветом
- Сообщения: 1681
- Зарегистрирован: Ср окт 04, 2006 6:30 pm
- Откуда: Las Vegas
Re: Задачи для IT интервью
сортировка 100 mln ints на моем ноуте занимает
Arrays.sort() - 9.5 sec
merge sort - 19.5 sec
radix sort - 4.2 sec
Arrays.sort() - 9.5 sec
merge sort - 19.5 sec
radix sort - 4.2 sec
-
- Уже с Приветом
- Сообщения: 143
- Зарегистрирован: Вт апр 29, 2014 7:22 am
Re: Задачи для IT интервью
Конечно. Попробую.valchkou писал(а): Вт июл 09, 2019 3:04 pm А можно попросить ваш современный код отсортировать 1 млн интегеров и замерить время.
Ради интереса, что оптимизирует сахар под капотом. Думаю что в контексте данного теста железо не так важно
но если что у меня mac intel i7, количество памяти и коров значение не имеют
Что то вроде такого.

Насколько помню, никогда так вот в книжках не писали. Смысл тогда в других алгоритмах? Насколько я могу помнить (всё таки читал такие книжки 20-25 лет назад), писали что то типа, что выбор конкретного алгоритма сортировки, "в реальных программах", зависит от многих факторов, и лучше использовать несколько алгоритмов, и применять в зависимости от ситуации, или модифицировать какой нибудь из "улучшенных" алгоритмов. Ведь не секрет, что при определённых условиях быстрая сортировка проиграет пузырьковой "улучшенной" и некоторым другим, как "улучшенным" (не факт, надо проверить) так и нет.