Изучение Java

1. Ibrogim 1313 03.05.15 12:10 Сейчас в теме
Решил изучать java
Если найдутся коллеги с интересом к этому языку, то предлагаю делиться ссылками на курсы и т.п.

Вот например весёлый курс в виде игры по футураме )
Первые 10 уровней бесплатно.

Зарегистрируйтесь по моей ссылке и я смогу пройди дальше 10 уровня (когда дойду до него)
reotem; DoctorRoza; +2 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
586. herfis 499 10.03.16 11:13 Сейчас в теме
Тоже начал ковыряться в джаве. Задачки на javarush, видеокурсы, Эккель. Прошел для освежения основ первый курс по алгоритмам на Coursera.
Концепция языка нравится. Много удачных находок и принятых решений. Все достаточно просто и эффективно.
Все, правда, признают что шарп, как язык, свежее и лучше (благо рождался с внимательной оглядкой на джаву). Но меня в экосистему мелкомягких не тянет почему-то.
Вместе с 1С за долгие годы как-то переел фронтенда, майкрософта и десктопных решений. Тянет в сторону линуха и сервер-сайда.
В джаве прельщает очень развитая и большей частью свободная экосистема для разработки сервер-сайда. Ну и свободное ПО как таковое. В эту сторону и смотрю.
В планах добить javarush, дочитать Эккеля, прочитать Блоха и в первом приближении на этом закончить с java core и начать вкуривать spring. Смотрю пока параллельно видеоматериалы по сервлетам и Tomcat. Самые базовые знания по сетевым технологиям есть, HTTP/HTML/CSS тоже чуток курил. Линух тоже щупал и изучал, но недостаточно глубоко. Ну да где наша не пропадала. Думаю попробовать в итоге наваять пару пет-проджектов для фана и потом решать, нравится мне это или нет и куда копать.
starik-2005; +1 Ответить
587. starik-2005 3039 12.03.16 11:03 Сейчас в теме
(586) herfis, ИМХО, в плане сборки проекта в линухе все куда веселее, чем в окнах: большая часть ООП в виде библиотек и приложений собирается в Линух с куда меньшим геморроем (на мой взгляд), если разобраться с весьма небольшим количеством особенностей командной строки, в которой со всей красой реализуются возможности тех же регулярных выражений для поиска и замены чего угодно.

Я сейчас на С++ "подсел": интересно, ностальгию пробуждает, при этом весьма современно и, что немаловажно, очень быстро.

Вот, кстати, вопрос сразу возникает. Написал программку, которая читает из stdin строки типа "1234,432123", сортирует их и выводит в stdout отсортированный файл. Для ста миллионов строк примерно за 3 минуты отрабатывает. Вот хочется понять, видит ли кто-нибудь из тех, кто может что-то об этом знать, где и что можно тут оптимизировать?

int main()
{	
	void* seria[10000];
	for(int j=0; j<10000; j++) {seria[j]=0;}
	
	std::string st;
	int i, seriax;

	while(1)
	{
		std::cin >> st;
		if(std::cin.eof()) break;
		i = 0;

		for (int j=0;st[j]>43;j++)
		{
			if(st[j] < 59 && st[j] > 47){i = i * 10 + st[j] - 48; }
			if(st[j] == 44){seriax = i; i = 0; }
			if(st[j]>64){i=seriax=0; break; }
		};

		if (!i && !seriax) {continue; } // some other simbol


		if (!seria[seriax]) {
				seria[seriax] = new uint32_t[31250];
				for(int j=0;j<31250;j++){((uint32_t*)seria[seriax])[j]=0; }
			}
		
		//std::cout << "i " << i << std::endl;
		((uint32_t*)seria[seriax])[i>>5] = ((uint32_t*)seria[seriax])[i>>5] | (uint32_t)(1 << (i % 32));
	}
	for(i=0;i<10000;i++)
		if (seria[i])
		{
			for(int j=0;j<31250;j++)
				if (((uint32_t*)seria[i])[j])
				{
					for(int n=0; n<32; n++) if ( (((uint32_t*)seria[i])[j]) & (uint32_t)(1 << n) ) 
					{
						std::cout << std::setw(4) << std::setfill('0') << i  << ",";
						std::cout << std::setw(6) << std::setfill('0') << j*32+n << std::endl;
						// << " value: " << ((uint32_t*)seria[i])[j] << std::endl;
						}
				}
		}
}
Показать
588. herfis 499 12.03.16 14:30 Сейчас в теме
(587) starik-2005, С точки зрения логики выполнения - не вижу, что тут можно оптимизировать в производительности. Кроме как заменить на другой алгоритм :)
Если распределение входных данных неравномерное (а на практике это бывает гораздо чаще, чем равномерное), то более универсальные алгоритмы (с деревьями, сортировками и поиском) вполне себе способны выиграть по скорости. Можно ведь взять за основу ту же идею с древовидной организацией частей числа и даже развить ее. И при этом она будет работать на ускорение классических алгоритмов поиска и сортировки. А сейчас она у тебя работает только на обход ограничений размерности встроенных типов данных. И это легко сделать полностью универсальным алгоритмом для чисел произвольного размера.
Попробуй расширь-ка допустимую разрядность целой части хотя бы до инта и сделай замер :) Во сколько превратятся твои три минуты :)
Про экспоненциальное потребление памяти я уже молчу.
589. starik-2005 3039 12.03.16 14:55 Сейчас в теме
(588) herfis, ну в действительности не совсем так. Размещенная выше программа никакого там ограничения размерности встроенных типов не обходит. Преобразование типов тут исключительно для сдвига (оптимизация деления и умножения, т.к. я строю битовую маску).

При использовании вместо stdin файлового потока у меня чтение файла осуществляется за 16 секунд (с сортировкой), а формирование вывода без записи - еще 1,5 секунды где-то. Т.е. основное время - это именно файловые операции.

Три минуты - это разархивация + запись файла: $bzip2 -d file -c | myprogramm > 1.txt.

Вот тайминг при чтении из уже разархивированного файла с записью в файл:
Read data: 16s
Create data file: 144s
All time: 160s
Out data numbers: 97155292


Стандартный sort этот файл сортирует за 5 минут в 8 потоков, так что мой алгоритм оптимальный.
590. herfis 499 12.03.16 15:08 Сейчас в теме
(589) starik-2005, Если бы можно было использовать примитивный тип достаточной длины с возможностью битовых операций - то никаких деревьев не понадобилось бы. Выигрыша производительности сама по себе такая структура в этом алгоритме не дает.
"Стандартный sort этот файл сортирует за 5 минут в 8 потоков, так что мой алгоритм оптимальный."
Не оптимальный, а всего лишь лучше стандартного sort, т.к. лучше оптимизирован под конкретную узкую задачу и набор входных данных.
592. starik-2005 3039 12.03.16 15:17 Сейчас в теме
(590) herfis, именно так - оптимизирован под конкретную задачу. Т.е. этот алгоритм за О(1) помещает новый элемент на свое место (т.е. элемент уже отсортирован). А потом за О(1) может проверить, есть ли искомое в списке или его там нет. Если у Вас есть предложение, как сделать за О(<1), то я с радостью Вас выслушаю, но у меня нет квантового компьютера в наличии, так что интерес будет чисто научный.

Файл (читаемый и записываемый), кстати, 1Гиб с небольшим - именно поэтому столько времени записывает. Обход построенной упорядоченной структуры занимает 1,5 секунд - т.е. за это время получаются все данные.

А по поводу оптимизации, то у меня вопросы не к алгоритму (т.к. быстрее физически нельзя), а именно к реализации (начальное обнуление массивов, расчет позиции, формирование битовой маски...)
593. herfis 499 12.03.16 16:57 Сейчас в теме
(592) starik-2005,
Отвечая на изначальный вопрос - существенно ускорить можно пойдя до конца и отказавшись от динамического выделения памяти :)
Если уж жертвовать памятью в угоду производительности, то можно довести дело до абсолюта. Будет еще быстрее и еще больше жрать памяти.
Сразу взять громадный сплошной кусок памяти, а древовидную структуру реализовывать просто вычисляя смещения в ней. Т.е. исключительно через указатели работать. Всю остальную логику такую же оставить.
Сначала инициализировать куски по смещениям, соответствующим целым частям и т.д. Для более эффективной работы с большими целыми частями, целые части тоже можно разбить.
594. starik-2005 3039 12.03.16 17:47 Сейчас в теме
(593) herfis, интереса ради посмотрел, какой процент времени тратится на выделение памяти - около 1%:
Read data: 17s

time for memory allocate: 157 648 tiks
time for read: 16 973 172 tiks


Динамически я выделяю память потому, что в данном конкретном случае встречаемость числа для первой колонки не более 50%, а это неплохой повод сэкономить на памяти.
595. minimajack 80 13.03.16 21:22 Сейчас в теме
(594) starik-2005, залейте куда нибудь "тестовый" пример - попробуем ускорить выполнение
596. starik-2005 3039 13.03.16 22:56 Сейчас в теме
(595) minimajack, тестовый пример можно сгенерить в принципе. calloc позволил отказаться от заполнения массива и ускорил работу выделения памяти почти в 2 раза. В принципе быстро работает. А код в (587)
597. minimajack 80 14.03.16 01:18 Сейчас в теме
(596) starik-2005, ну пока я увидел только один вариант...заполнения.
всегда 4 целых и 6 десятичных....и как выглядят варианты с нулями...до начала символов, в конце. Дополнительные знания помогут написать быстрый алгоритм.
Как обычно - проще один файл с "правильными" данными для тестов, чем угадывание кучи ответов на вопросы
598. herfis 499 14.03.16 10:40 Сейчас в теме
(596) starik-2005, Попробую более "высокоуровневый" вариант на java набросать ближайшее время. На тех же принципах, но более универсальный. И более тормознутый ессно :) В конце-концов изучаю я java или нет :) Интересно будет сравнить, насколько тормознутее. А спецы по java может что интересное подскажут, авось новое что узнаю :)
599. herfis 499 14.03.16 11:01 Сейчас в теме
(596) starik-2005, Слушай... А ты уверен, что у тебя в рамках дробной части правильная сортировка?
А то сдается мне, что числа "1.64" и "1.638" отсортируются неправильно.
600. starik-2005 3039 14.03.16 14:53 Сейчас в теме
(599) herfis, а запятая - это разделитель. До него всегда 4 символа, после него всегда 6.
601. minimajack 80 15.03.16 08:07 Сейчас в теме
(600) starik-2005, попробуй такой вариант на данных(файл прикрепил)
читает из input.txt - вывод в output.txt
формат файла 4 числа десятичных, запятая, 6 чисел дробных, перевод строки(Unix style)
Прикрепленные файлы:
calculate.exe
602. starik-2005 3039 15.03.16 10:27 Сейчас в теме
(601) minimajack, не, только исходник! У меня на лигухе и читает, и пишет - все в 20 кб уместилось (200 строк кода), а тут 150! Нафиг, нафиг - вирусы я и сам пейсать умею, чужие мне не нужны...
603. minimajack 80 15.03.16 10:40 Сейчас в теме
(602) starik-2005, да емае...дам исходники - а ты мне: "а где make-файл?А чё не собирается?А какие версии либ надо?" Проверь скорость на Выне - на пару сот метров файл - устроит, я тебе хоть на гитхаб код залью) но только дома, т.к. на работе вынь vs2008, и gcc-ом не пахнет.

PS уложился в 100 строк кода :р
PPS обновил программу - последний таймер поправил и лишние заголовочные порезал
PPPS еще обновление - добавил бинарное чтение файла, убрал лишнее
Прикрепленные файлы:
calculate.exe
604. starik-2005 3039 15.03.16 23:00 Сейчас в теме
(603) minimajack, у меня в системе exe-файлы без вайна не стартуют )))

А вообще. полагаю, не плохо. Либы и так понятно какие - буст, правда в доступном репозитарии в лине 1.55 (в моей версии 14.04), а float_sort появился в 1.58, на сколько я понял. Попробую закомпилить. Но у меня решение без лишних библиотек + О(N), в отличие от бустовской сортировки: "This way worst-case performance is guaranteed to be the better of О(N⋅log2(N)) comparisons and О(N⋅log2(K/S + S)) operations where" - как-то так, по крайней мере в документации к либе так написано. Лог2(97 000 000) = ~36-37, т.е. это более миллиарда операций. Я же просто вычисляю место бита в памяти - одна операция, одна вставка.
605. minimajack 80 16.03.16 08:10 Сейчас в теме
(604) starik-2005, под линь скорость сортировки возросла в 2 раза, правда собирал под 64-бит. В общем https://gist.github.com/anonymous/89b96f0e105640401e22 - неплохой вариант когда надо экономить память.

PPS в любом случае такой текстовый файл нехило жмется - и лучше грузить его в память программы сжатым - и распаковывать в памяти программы...ну и записывать аналогично сжатым - так можно сэкономить очень много времени.
606. starik-2005 3039 16.03.16 08:32 Сейчас в теме
(605) minimajack, по поводу памяти, то тут лучше посчитать. Тип float занимает 6 байт, но, на сколько я понял,он для флоатсорт преобразуется в инт 32. Т.е. 4 байта. 4*97 000 000 = 400 000 000 байт, 400 мб. Т.е. 400 мб сейчас при таком подходе.
Битовая маска - это 1 бит на каждый вариант типа 1234,567890. Т.к. 1234 в диапазоне [0000,9999], а 567890 - [000000,999999], то для размещения первого можно выделить массив void* на 40кб, для размещения 1кк бит нужно 1кк/8 = 125 000 байт,125кб. При худшем варианте выделяем 125кб*10000=125мб*10=1,25гиб. Но по факту нужно не более 30% от этой памяти,т.е. те же 400 мб (совсем по факту - 347мб). Т.е. метод с битовой маской не только быстрее, но и по памяти дешевле.
607. minimajack 80 16.03.16 09:01 Сейчас в теме
(606) starik-2005, да точно, забыл что там биты, а не байты). Претензий нет, именно под формат < 4-6 - это оптимальный вариант. Тогда оставим поразрядную сортировку для чисел > 4-6 - типа 11111,111111
608. starik-2005 3039 16.03.16 19:15 Сейчас в теме
(607) minimajack, ну как-то так...
609. herfis 499 20.03.16 16:05 Сейчас в теме
Как и обещал, попробовал наваять на java алгоритм "жадной сортировки" по принципам из (587) и некоторыми кусками оттуда.
Исключительно в целях саморазвития и в рамках изучения java.
Можно настраивать размеры целой и дробной части, а также регулировать количество частей, на которые они разбиваются.
На домашнем компе 20 миллионов строк с равномерно распределенными числами 4 знака целой части и 6 дробной (четвертьгиговый файл) сортируется за 36 секунд. Нормального профилирования не делал, т.к. в java пока не настоящий сварщик. Но судя по тому, что 10 миллионов строк сортируются за вдвое меньшее время - львиная доля времени выполнения приходится на ввод/вывод.
Если пытаться более крупные файлы скармливать, то на домашнем компе с 8 гигами ОЗУ java начинает захлебываться по памяти. Сборщик мусора начинает лихорадить и резко растет время выполнения. Ессно, если распределение чисел неравномерное будет, то памяти будет расходоваться резко меньше и, соответственно, будет кушать файлы побольше. Учитывая, как много времени занимает ввод-вывод, сдается мне что классические методы сортировки NlogN будут не шибко медленнее. Ради интереса, чуть позже попробую реализовать и сравнить.
Буду благодарен джавистам за дельную критику. Шибко не пинать, я только учусь.

import java.io.*;
import java.util.Random;

public class GreedyNumberSorter {

    private static final int INT_MAX_DIGITS = 4, FRACT_MAX_DIGITS = 6, INT_NODE_BITS = 14, FRACT_NODE_BITS = 3;
    private int intMaxDigits, fractMaxDigits;
    private int intMaxBits, fractMaxBits;
    private int intNodeBits, fractNodeBits;
    private int intPartsQty, fractPartsQty;
    private int intNodeMask, fractNodeMask;
    private NumberNode root;

    GreedyNumberSorter(int intMaxDigits, int fractMaxDigits, int intNodeBits, int fractNodeBits) {
        this.intMaxDigits = intMaxDigits;
        this.fractMaxDigits = fractMaxDigits;
        this.intMaxBits = getBitsQty(intMaxDigits);
        this.fractMaxBits = getBitsQty(fractMaxDigits);
        this.intNodeBits = intNodeBits;
        this.fractNodeBits = fractNodeBits;
        this.intPartsQty = intMaxBits / intNodeBits + (intMaxBits % intNodeBits == 0 ? 0 : 1);
        this.fractPartsQty = fractMaxBits / fractNodeBits + (fractMaxBits % fractNodeBits == 0 ? 0 : 1);
        this.intNodeMask = (1 << INT_NODE_BITS) - 1;
        this.fractNodeMask = (1 << FRACT_NODE_BITS) - 1;
        this.root = new NumberNode();
    }

    GreedyNumberSorter(int intMaxDigits, int fractMaxDigits) {
        this(intMaxDigits, fractMaxDigits, INT_NODE_BITS, FRACT_NODE_BITS);
    }

    GreedyNumberSorter() {
        this(INT_MAX_DIGITS, FRACT_MAX_DIGITS);
    }

    public static final int getBitsQty(int digits) {
        long maxNumber = 10;
        for (int num = 1; num < digits; num++) maxNumber *= 10;
        maxNumber--;
        int bits = 0;
        for (long remain = maxNumber; remain > 0; remain /= 2) bits++;
        return bits;
    }

    private static class NumberNode {
        private NumberNode[] nodes;
    }

    private static final int[] getNumberParts(long number, int partDigits, int partsQty, int partMask) {
        int[] parts = new int[partsQty];
        long numberRemain = number;
        for (int level = 0; level < partsQty && numberRemain != 0; level++) {
            parts[level] = (int) numberRemain & partMask;
            numberRemain >>= partDigits;
        }
        return parts;
    }

    private final void addNumber(long intPart, long fractPart) {

        NumberNode numberNode = root;

        int[] parts = getNumberParts(intPart, intNodeBits, intPartsQty, intNodeMask);
        for (int level = intPartsQty - 1; level >= 0; level--) {
            if (numberNode.nodes == null) numberNode.nodes = new NumberNode[1 << intNodeBits];
            if (numberNode.nodes[parts[level]] == null) {
                numberNode.nodes[parts[level]] = new NumberNode();
            }
            numberNode = numberNode.nodes[parts[level]];
        }
        parts = getNumberParts(fractPart, fractNodeBits, fractPartsQty, fractNodeMask);
        for (int level = fractPartsQty - 1; level >= 0; level--) {
            if (numberNode.nodes == null) numberNode.nodes = new NumberNode[1 << fractNodeBits];
            if (numberNode.nodes[parts[level]] == null) {
                numberNode.nodes[parts[level]] = new NumberNode();
            }
            numberNode = numberNode.nodes[parts[level]];
        }
    }

    public void generateRandomNumbersFile(String filename, int numberCount) throws IOException {

        BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
        Random random = new Random();
        for (int i = 0; i < numberCount; i++) {
            writer.write(""
                    + Math.abs(random.nextLong()) % (long) Math.pow(10, intMaxDigits) + ","
                    + Math.abs(random.nextLong()) % (long) Math.pow(10, fractMaxDigits) + "\r\n");
        }
        writer.close();
    }

    public void readNumbersFile(String filename) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        long intPart = 0, fractPart = 0;
        boolean itsIntPart = true;
        for(String strNumber; (strNumber = reader.readLine()) != null;) {
            int fractDigits = 0;
            for(char ch : strNumber.toCharArray()) {
                if (ch > 47 && ch < 59)
                    if (itsIntPart) intPart = intPart*10 + ch - 48;
                    else {fractPart = fractPart*10 + ch - 48; fractDigits++;}
                else if (ch == 44) itsIntPart = false;
            }
            for (int digits = fractDigits; digits < fractMaxDigits; digits++) fractPart *= 10;
            addNumber(intPart, fractPart);
            intPart = fractPart = 0; itsIntPart = true;
        }
        reader.close();
    }

    public void out(BufferedWriter bw, NumberNode numberNode, int level, long intPart, long fractPart) throws IOException {
        int intBitsOfShift = (intPartsQty - level - 1) * intNodeBits;
        int fractBitsOfShift = (fractPartsQty + intPartsQty - level - 1) * fractNodeBits;
        for(int i = 0; i < numberNode.nodes.length; i++) {
            if (numberNode.nodes[i] != null) {
                if (level < intPartsQty) intPart = ((intPart >> intBitsOfShift & ~intNodeMask) + i) << intBitsOfShift;
                else fractPart = ((fractPart >> fractBitsOfShift & ~fractNodeMask) + i) << fractBitsOfShift;
                if (numberNode.nodes[i].nodes == null) bw.write("" + intPart + "." + fractPart + "\r\n");
                else out(bw, numberNode.nodes[i], level + 1, intPart, fractPart);
            }
        }
    }

    public void print(BufferedWriter bw) throws IOException {
        if (root.nodes == null) return;
        out(bw, root, 0, 0, 0);
    }

    public static void main(String[] args) throws IOException {
        GreedyNumberSorter greedyNumberSorter = new GreedyNumberSorter();
//        greedyNumberSorter.generateRandomNumbersFile("D:\\test.txt", 20000000);
        greedyNumberSorter.readNumbersFile("D:\\test.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\testout.txt"));
        greedyNumberSorter.print(bw);
        bw.close();
    }
}
Показать
591. herfis 499 12.03.16 15:11 Сейчас в теме
Готов признать, что на определенных наборах данных по скорости сортировки он заткнет за пояс любые другие алгоритмы.
Просто при этом он обладает рядом недостатков, которые делают невозможным его широкое практическое применение.
610. herfis 499 20.03.16 17:25 Сейчас в теме
Как я и подозревал, стандартными алгоритмами получилось не медленнее. С использованием штатного джавовского TreeSet (красно-черное бинарное дерево) 50 миллионов строк (на сколько памяти хватило без потери производительности) отсортировало за полторы минуты :)

import java.io.*;
import java.util.TreeSet;

public class NormalNumberSorter {

    private static final int FRACT_MAX_DIGITS = 6;
    private int fractMaxDigits;
    private TreeSet<Number> set = new TreeSet<Number>();

    public NormalNumberSorter(int fractMaxDigits) {
        this.fractMaxDigits = fractMaxDigits;
    }

    public NormalNumberSorter() {
        this(FRACT_MAX_DIGITS);
    }
    private static class Number implements Comparable<Number>{
        long int_part;
        long fract_part;

        public Number(long int_part, long fract_part) {
            this.int_part = int_part;
            this.fract_part = fract_part;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Number number = (Number) o;
            if (int_part != number.int_part) return false;
            return fract_part == number.fract_part;
        }

        @Override
        public int hashCode() {
            int result = (int) (int_part ^ (int_part >>> 32));
            result = 31 * result + (int) (fract_part ^ (fract_part >>> 32));
            return result;
        }

        @Override
        public int compareTo(Number o) {
            if (int_part > o.int_part) return 1;
            else if (int_part < o.int_part) return -1;
            else if (fract_part > o.fract_part) return 1;
            else if (fract_part < o.fract_part) return -1;
            else return 0;
        }

    }

    public void readNumbersFile(String filename) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        long intPart = 0, fractPart = 0;
        boolean itsIntPart = true;
        for(String strNumber; (strNumber = reader.readLine()) != null;) {
            int fractDigits = 0;
            for(char ch : strNumber.toCharArray()) {
                if (ch > 47 && ch < 59)
                    if (itsIntPart) intPart = intPart*10 + ch - 48;
                    else {fractPart = fractPart*10 + ch - 48; fractDigits++;}
                else if (ch == 44) itsIntPart = false;
            }
            for (int digits = fractDigits; digits < fractMaxDigits; digits++) fractPart *= 10;
            set.add(new Number(intPart, fractPart));
            intPart = fractPart = 0; itsIntPart = true;
        }
        reader.close();
    }

    public void out(BufferedWriter bw) throws IOException {
        for (Number number : set) bw.write("" + number.int_part + "." + number.fract_part + "\r\n");
    }

    public static void main(String[] args) throws IOException {
        NormalNumberSorter normalNumberSorter = new NormalNumberSorter();
        normalNumberSorter.readNumbersFile("D:\\test.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\testout.txt"));
        normalNumberSorter.out(bw);
        bw.close();
    }
}
Показать
611. Serginio 938 20.03.16 20:03 Сейчас в теме
613. Serginio 938 20.03.16 22:06 Сейчас в теме
B++ дерево это не двоичное дерево. Это индексы которые используются в БД.
Хэш таблица конечно быстрее, но иногда нужен поиск на больше или меньше в сортированном списке.
619. herfis 499 21.03.16 10:22 Сейчас в теме
Можно сказать, что "жадное" дерево (starik-2005) - это то же самое B+ дерево, где каждый узел содержит все возможные для своего уровня варианты ключей.
starik-2005; +1 Ответить
622. Serginio 938 21.03.16 12:02 Сейчас в теме
А красно черное дерево чем является? Там как раз сравнение на больше меньше.
По большому счету Хэш таблица там где нужно точное соответствие, Б+ деревья там где нужна сортировка или нужно хранить данные на диске. Остальные алгоритмы сильно зависят от специфики данных
623. herfis 499 21.03.16 12:53 Сейчас в теме
(622) Serginio, Я говорил не про красно-черное дерево. Я говорил про алгоритм из (587) на сях, вариацию которого я реализовал на джаве в (609). Именно для него я использовал эпитет "жадный". А вариант с красно-черным деревом приведенный в (610) использовался просто для сравнения по производительности.
624. Lokiy 136 28.03.16 11:49 Сейчас в теме
Я отрыл доступ для России в свою игрушку которую пилил :)
https://play.google.com/store/apps/details?id=labyrinth.d3D.maze&referrer=utm_source%3Dinfostart
кто хочет может попробовать что получилось :)
Пилил на чистой java+ opengl без всяких движков.

P.S. поставьте 5ку, кому не жалко в гуглплей, на старте это очень надо :)
625. ture 606 09.04.16 09:35 Сейчас в теме
Вот интересно стало. А что это компонент для 1с на java не видно?
626. starik-2005 3039 09.04.16 11:26 Сейчас в теме
(625) ture, предположу, что т.к. код java компилируется в байт-код для виртуальной машины java, а потом исполняется этой машинкой, то, полагаю, обернуть это все для СОМ не просто, хотя и возможно. А с native - вообще пока не представляю, как это сделать? Возможно, есть какой-то механизм, позволяющий завернуть java-код в обертку от С/С++/...
627. Xershi 1484 09.04.16 12:33 Сейчас в теме
(625) ture, видел реализацию qr-кода используя джаву, только какую я не разбирался.
628. herfis 499 11.04.16 10:35 Сейчас в теме
(625) ture, Нет особого смысла в этом. Может, теоретически как-то и можно исхитриться, только все равно на том же C# будет и легче и удобнее и вообще. Я бы сказал, что если ориентироваться на винду и создание чего-то полезного в применении к 1С - на java можно вообще внимания не обращать. Разве что в качестве платформы для сторонних веб-сервисов.
У java лично я вижу только две очень сильных стороны на текущем рынке разработки - создание линуксового бэкенда и мобильные приложения. Все остальное что она может - скорее довески, которые в голом виде имеют "более лучшие" альтернативы.
Где java очень сильна - это в разработке сложных прикладных серверных решений под линукс. Там у нее есть очень развитая инфраструктура, инструментарий и документация. Причем очень многое - бесплатное или условно-бесплатное. В итоге можно достаточно эффективно создавать сложные продуктовые решения, практически не затрачиваясь на лицензии. Это очень привлекательно, т.к. в идеале можно обойтись затратами только на разработку и хостинг. В результате за бугром есть дохренища больших систем в компаниях, написанных на java и стабильный спрос на программистов. Хотя для относительно простых систем (в части разработки), тот же питон проще и эффективнее. И руби там всякие с php. Поэтому java чаще именно в энтерпрайзе используется.
629. ture 606 04.05.16 16:31 Сейчас в теме
(628) herfis, на линухе java? Это у меня в голове не укладывается. В общем-то это вовсе не значит, что я прав. Доводы у меня такие:
1) чуть библ претендует на многократное использование и хочет в дистрибутив, так исходники на СИ
2) чуть серверная прога с намеком на нагрузку, так прога опять на с/с++ (epoll, openMP и пары сокетов, чтоб форки вязать)
3) чуть прога ориентирована на интерфейс, так питон прет из всех щелей (этот гребанный)

Собственно виртуальную машину java надо всегда самому инсталить, а потом жалеть, что сдуру тачку завесил и теперь еле ворочается.

Нет конечно, я слышал прелюдию о полезности для бизнеса (в сап, например), но на деле сталкиваюсь крайне редко с java. И всегда тормоза и просаживание по скорости и количестве соединений.
630. herfis 499 10.05.16 09:24 Сейчас в теме
(629) ture, Так я и не говорил про "библы" и десктоп. А то, что в забугорном ентерпрайзе java очень популярна я слышал еще на заре своих занятий 1С, что было достаточно давно. Использование виртуальной машины имеет кучу преимуществ перед статической компиляцией с точки зрения быстрой разработки сложных и безопасных приложений. Настолько весомых, что майкрософт сейчас использует точно такую же инфраструктуру.
ЗЫ. Что касается кривых приложений на java - кому как не одинэсникам знать, что виновата не платформа :) Я вообще вижу много параллелей между java и 1С. Достаточно условных, но тем не менее. Видимо потому, что я мало чего кроме 1С знаю :) java, как и 1С, часто используется для написания автоматизированных систем силами самого предприятия. Т.е. когда нужно много и часто "допиливать" продукт под нужны предприятия собственными силами. Для написания неизменяемого утилитарного функционала ессно выгоднее использовать статическую компиляцию.
631. ture 606 24.05.16 18:19 Сейчас в теме
Для знатоков жабы есть приятная новость - курс по Hadoop перезапустили. Распределенная системы вычислений на писана на жабе. Знаний особых, вроде, не требуется. Я логадался, что практика нужна Вам. Ну вот ищите её на степике.

А вообще, по-моему, питон стал важнее жабы. Но у каждого свое мнение.
633. herfis 499 25.05.16 10:01 Сейчас в теме
(631) ture, Питон, как по мне, еще ближе к 1С чем джава. Динамическая типизация, все дела. Питон еще более эффективен в части быстрой разработки. И вообще питон прикольный :) Мне в нем очень многое нравится. Поэтому, наверное, соглашусь, что в части быстрой разработки для web питон гораздо более популярен. И для тех задач где подходят чисто скриптовые языки он гораздо более удобен. Но говорить, что он более важен? Это как-то странно. У них не идентичные области покрытия с java, хотя и пересекающиеся. Покрытие java значительно шире.
Джава занимает "странное" промежуточное положение. С одной стороны, статическая типизация не позволяет просто и лаконично писать "простые" вещи (как можно в питоне), с другой - сложнее напортачить в сложных и легче писать сложные высокопроизводительные вещи "с нуля". Java как бы одной ногой стоит в RAD, а другой - в низкоуровневом программировании. Причем и там и там - "так себе" стоит. Но именно это и привлекает. Широта решаемых задач. Можно скриптописать в стиле 1С под какой-нить фреймворк. А можно при необходимости навелосипедить высокопроизводительный (и многозадачный!) кусок не привлекая для этого сторонние инструменты и специальные финты. Или даже написать собственный высокоэффективный фреймворк. Причем на java, в силу особенностей инструментов, предоставляемых виртуальной машиной и языком, относительно просто создавать эффективные фреймворки. Именно поэтому всевозможных фреймворков на java - хоть залейся. И в этом как бы основная сила java, как по мне. В таком вот уникальном сплаве возможностей и широте решаемых задач. Java пытается усидеть на нескольких стульях сразу и в ряде случаев это вполне себе удается и именно то, что надо.
634. ture 606 25.05.16 18:11 Сейчас в теме
(633) herfis, ну я уж не знаю как там на деле. Я привык, что программисты java стоят вежливо в сторонке, когда надо написать что-то быстрое или серверное. Не особенно они выделяются, когда надо что-то связанное с учетом на предприятии поделать. У меня вообще сформировалось ощущение, что системные администраторы и программисты java на одной ступеньки посиживают.
635. herfis 499 26.05.16 09:33 Сейчас в теме
(634) ture, Не совсем понятно, что вы хотели этим всем сказать. Сами же Hadoop упомянули. Это достаточно быстрое и серверное? Или не очень?
Или мы переводим разговор с возможностей языка и его инфраструктуры на конкретных людей, с которыми вам приходится работать?
Ну так я вам хочу сказать, что у 100% (округленно :) специалистов "извне" впечатления об одинэсниках очень далекие от лестных. И что?
Заниматься навешиванием ярлыков - мягко говоря неумное занятие.
636. ture 606 26.05.16 10:25 Сейчас в теме
(635) herfis, гы-гы с/с++ я уже выучил (если так принято выражаться). Теперь надо выбирать второстепенный язык на подхват (но желательно с будущим) или конкретную специализацию. Шаурма бесполезна (летали... я не герой и не патриот ведра). Кисло смотрю на жабу и склоняюсь к питону (он есть в каком-то виде в постгри, но база особо не нужна). Эту глупость "почему я знаю java и не разбираюсь в с/с++" я встречал не раз, ровно как и нытьё на олимпиадах, что тот же код на жабе всегда за дверью. В области сапа есть в какой-то форме жаба, но безумного дохода я там не вижу. Конечно новичок меня не убедит, а профи мне самому еще понять надо. Ярлыки - это когда ты пришел в курилку студентов мгу и сказал, что на паскале ты... а все вокруг - Паскаль? что это? новый язык? я уж молчу про то, как с этим на работу приходить. Запомни, ярлык=<твоя зарплата>. И больше не спрашивай.
637. herfis 499 26.05.16 11:25 Сейчас в теме
(636) ture, То, что советы друг-друга нам не требуются и бесполезны, я уже понял.
632. MishaD 14 24.05.16 19:15 Сейчас в теме
Про 1C ring, для запуска которого тоже жаба нужна уже писали ?
638. ture 606 30.05.16 13:38 Сейчас в теме
Поставил Hadoop на linux. Сервер лег. Висит даже в ssh. В top java. Я даже не удивился.
639. herfis 499 30.05.16 17:22 Сейчас в теме
(638) ture, И к чему вы больше склоняетесь? java тормозит (потому что это ее ключевая фича)? hadoop писали криворукие программисты (потому что других на java не бывает)? Или все-таки оба варианта? Я теряюсь в догадках.
640. ture 606 28.10.16 17:14 Сейчас в теме
(639) я не склоняюсь к java и мне не приходит в голову использовать хадуп (спасибо мейлу за краткий экскурс).
647. s0nya 27.11.18 18:35 Сейчас в теме
Много IP телефонов (железных) работают на JAVA (Cisco, Siemens). Функции выполняют, но тормознытые. А насчет програмирования, то самый прикольный Python. И разработку вести легко и может пригодится для разных задач. С java как то все сложнее.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот