public class SequenceTest { //0 1 2 3 4 5 6 7 8 static int[] qwe = {1, 4, -6, 2, -1, 5, 2, 0, -6}; //static int[] qwe = {1, 2, 3, 4, 5, 6, 7}; @Test public void test() { int maxSum = 0; int i1 = 0; int i2 = 0; int newSum = 0; int i1n = 0; int i2n = 0; for (int i = 0; i < qwe.length; i++) { int x = qwe[i]; if (newSum == 0) { i1n = i; } i2n = i; int current = newSum + x; if (current > newSum) {//подпоследовательность растёт newSum = current; } else {//подпоследовательность начала уменьшаться if (newSum > maxSum) {//если сумма текущей подпоследовательности больше чем maxSum - запомним её maxSum = newSum; i1 = i1n; i2 = i2n; } if (current <= 0) {//если подпоследовательность меньше 0 она уже не может быть полезной newSum = 0; i1n = 0; i2n = 0; } else {//продолжаем рассматривать уменьшающуюся последовательность newSum = current; } } } if (maxSum == 0 && newSum > 0) { maxSum = newSum; i1 = i1n; i2 = i2n; } System.out.println(i1 + "-" + i2 + " maxSum:" + maxSum); } }
воскресенье, 20 марта 2011 г.
Наибольшая общая подпоследовательность
среда, 16 марта 2011 г.
XStream vs Simple
XStream быстрее чем Simple приблизительно в два раза. Тестил под Windows. Для теста были созданы сущности с дублирующими друг друга аннотациями для XStream и Simple.
Класс тестика:
XSTREAM x 100 = 138 SIMPLE x 100 = 213
<CONTAINER PART="0">
<BIG CODE="String code 50.35868861427403564" LOGIN="String login 50.7245088483040268" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
<BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
</BIG>
<BIG CODE="String code 60.9978869534936364" LOGIN="String login 60.22744058846132909" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
<BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
</BIG>
</CONTAINER>
PS: значение атрибутов генериловалось для каждой итерации новое
Класс тестика:
package ru.test.serialization; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.*; import org.junit.Test; import org.simpleframework.xml.convert.AnnotationStrategy; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.strategy.Strategy; import java.io.StringWriter; /** * @author k.burmistrov */ public class SimpleVSXstream { @Test public void test() { XStream xStream = new XStream(new DomDriver()); Persister serializer = new Persister(); long smplstart; long smplexecTime = 0; Container container; long xsstart;
long xsexecTime = 0; String res = "";
for (int i = 0; i < 100; i++) { container = ContainerCreator.getContainer(); xsstart = System.currentTimeMillis(); res = xStream.toXML(container); xsexecTime = xsexecTime + (System.currentTimeMillis() - xsstart); StringWriter writer = new StringWriter(); try { smplstart = System.currentTimeMillis(); serializer.write(container,writer); } catch (Exception e) { smplstart = System.currentTimeMillis(); e.printStackTrace(); } res = writer.toString(); smplexecTime = smplexecTime + (System.currentTimeMillis() - smplstart); } System.out.println( "XSTREAM x 100 = " + xsexecTime); System.out.println( "SIMPLE x 100 = " + smplexecTime); System.out.println("\n" + ContainerCreator.toDebugString(res)); } }Результирующий вывод:
XSTREAM x 100 = 138 SIMPLE x 100 = 213
<CONTAINER PART="0">
<BIG CODE="String code 50.35868861427403564" LOGIN="String login 50.7245088483040268" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
<BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
</BIG>
<BIG CODE="String code 60.9978869534936364" LOGIN="String login 60.22744058846132909" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
<BIG CODE="String code" LOGIN="String login" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 10.06973240045944129" LOGIN="String login 10.9788960825360289" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 20.627970543681521" LOGIN="String login 20.5815827829176397" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 30.9800044849451679" LOGIN="String login 30.5987182743788726" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
<BIG CODE="String code 40.9685538564759587" LOGIN="String login 40.11954755881153056" SUBADDRESS="0">
<PART PART="0" SERIAL="0"/>
</BIG>
</BIG>
</CONTAINER>
вторник, 8 февраля 2011 г.
SQL Поиск дырок
Задача: в последовательности айдишников найти пропуски.
Пример 1: Дырка в одну цифру.

В таблице "_IDCHECK" нужно
Найти 6.
Наверное проще всего это сделать при помощи left outer join.
Джоиним таблицу саму с собой со сдвигом на 1.
Чтобы понять как это работает сначала посмотрим результаты такого запроса

select a.id, b.id
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
Осталось выбрать столбцы где b.id == null
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null
И убрать последнее значение
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null and a.id<(select max(id) from "_IDCHECK" )
ЗЫ: тоже самое можно написать через select
select a.id+1 from "_IDCHECK" as a
where not exists(select * from "_IDCHECK" as b where b.id=a.id+1)
Пример 1: Дырка в одну цифру.

В таблице "_IDCHECK" нужно
Найти 6.
Наверное проще всего это сделать при помощи left outer join.
Джоиним таблицу саму с собой со сдвигом на 1.
Чтобы понять как это работает сначала посмотрим результаты такого запроса

select a.id, b.id
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
Осталось выбрать столбцы где b.id == null
select a.id+1
from "_IDCHECK" as aleft outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null
И убрать последнее значение
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null and a.id<(select max(id) from "_IDCHECK" )
ЗЫ: тоже самое можно написать через select
select a.id+1 from "_IDCHECK" as a
where not exists(select * from "_IDCHECK" as b where b.id=a.id+1)
пятница, 26 ноября 2010 г.
NEUROMANCER переводы на русский
Русский(Б.Кадников, О.Колесников) - http://lib.ru/GIBSON/gibso01.txt
Русский(М. Пчелинцев и Е. Летов)http://lib.rus.ec/b/160980
Английский - http://project.cyberpunk.ru/lib/neuromancer/
Однажды пришли Б.Кадников, О.Колесников(далее БКОК) и перевели Neuromancer.
Сначала они перевели название. Нейромантик. Забавно звучит. Тобишь, есть Нейромант, а это - рассказ про его маленького сына - Нейромантика. Хорошо что не перевели как Нерво-Сочинитель. Вообще в русском переводе самое оторванное название было бы - мозгопар. Спустя пару лет после БКОК пришли М. Пчелинцев и Е. Летов(МПЕЛ), и тоже перевелии. Название перевели нормально, а в остальном также. Но перевод МПЕЛ мне как то приятнее читать, и тупят они меньше, хотя точность перевода местами оставляет желать лучшего. Ну, перейдём к тексту - вот несколько какашечек с перевой же странички.
1. БКОК Не понял юмор, МПЕЛ молодец
Eng. `It's not like I'm using,' Case heard someone say, as he
shouldered his way through the crowd around the door of the
Chat. `It's like my body's developed this massive drug deficiency.'
БКОК. Проталкиваясь через толпу перед дверями "Чата", Кейс услышал, как
кто-то сказал:
- Не то чтобы мне все это нравилось. Просто мой организм уже привык к
тому, что я в него вкачиваю.
МПЕЛ. — Разве же я употребляю? — услышал Кейс, продираясь сквозь толпу к «Тацу». — Просто у моего организма острая алкогольно–наркотическая недостаточность.
2.БКОК придумал слово, МПЕЛ его переписал
Eng. Sprawl (the urban area formed by the expansion of a town or city into surrounding countryside
)
БКОК. Мурашовник
МПЕЛ. Муравейник
Правильный. Окраины, Пригород. Можнно назвать Бутово(в оригинали это окраины Бостона, так что первая буква хоть правильная)(http://en.wikipedia.org/wiki/The_Sprawl).
3.БКОК упускает детали и путает значения прилагательных, МПЕЛ упускает нюансы словоблудия оригинала
Eng. Case found a place at the bar, between the unlikely tan on one of Lonny Zone's whores and the crisp naval uniform of a tall African whose cheekbones were ridged with precise rows of tribal scars
БКОК. Кейс разыскал себе место за стойкой, между
неприглядным загаром одной из шлюх Лонни Зона и чистенькой униформой
высокого африканца, чьи щеки украшали ровные ряды ритуальных шрамов.
МПЕЛ.Тот нашел себе место у стойки между невероятно загорелой шлюхой из команды Лонни Зоуна и высоким африканцем в отглаженной морской форме с аккуратными рядами племенных шрамов на щеках.
Правильный. Кейс разыскал себе место за стойкой, между
неестественным загаром одной из шлюх Лонни Зона и отглаженной морской униформой
высокого африканца, чьи щеки украшали ровные ряды ритуальных шрамов.
4.БКОК пытается переводить ближе к тексту. МПЕЛ пейсатель сам
Eng.`Isn't you either, sister. So you vanish, okay? Zone, he'sa close personal friend of mine.'
She looked Case in the eye and made the softest possible
spitting sound, her lips barely moving. But she left.
БКОК. - К тебе это тоже относится, сестренка. Линяй отсюда, ага? Зон - один
из моих друзей.
Девушка посмотрела Кейсу в глаза и изобразила плевок, но тем и
ограничилась. Затем молча встала и отошла.
МПЕЛ.— И у тебя, цыпа, тоже не выйдет. И вообще, вали–ка ты отсюда. Мистер Зоун — мой лучший друг.
Девица в упор взглянула на Кейса и беззвучно ощерилась. Но все–таки ушла.
Правильный. И у тебя тоже сестричка, так что исчезни, ладно? Мистер Зоун — мой хороший друг. Шлюшка посмотрела Кейсу в глаза и тихо сплюнула, её губы дрогнули. Но она ушла.
суббота, 2 октября 2010 г.
SCJP/OCPJP(Oracle Certified Professional Java Programmer)
СОРС
http://in.sun.com/training/catalog/courses/CX-310-065.xml
БРИФ
1)http://www.rsdn.ru/article/java/scjp_article.xml Вспомнить то что не знал.
Полезность 5 из 5.
3)
Полезность 5 из 5.
2) http://topcode.ru/scjp/ Вспомнить то что не знал.
Полезность 4 из 5.
ХАЛЯВА
2)http://www.whizlabs.com/scjp/scjp.html 14 вопросов c объяснениями. Нужна регистрация.
Полезность 4 из 5.
3)http://www.quizful.net/test Нужна регистрация + нужно заработать балы(чтобы пройти scjp) вкладом в развитие сайта(например статью написать) . В основном материал по java 1.4. Если нету лишних часов - лучше не заморачиваться.
Полезность 3 из 5.
4)http://www.ucertify.com 15 вопросов. Нужно устанавливать вражеский ехе. Вопросы содержат некорректные имена, местами перепутаны ответы.
Полезность 3 из 5.
РАЗНОЕ
IO/NIO
java.util.Scanner
FileChannel
FileReader
ЗЫ.
Экзамен не включает вопросы про побитовые операции/сдвиги и тп.
http://in.sun.com/training/catalog/courses/CX-310-065.xml
БРИФ
1)http://www.rsdn.ru/article/java/scjp_article.xml Вспомнить то что не знал.
Полезность 5 из 5.
3)
SCJP Sun Certified Programmer for Java 6 Study Guide
Авторы: Kathy Sierra,Bert Bates. Самая клёвая книжка про scjp.Полезность 5 из 5.
2) http://topcode.ru/scjp/ Вспомнить то что не знал.
Полезность 4 из 5.
ХАЛЯВА
1)http://www.javachamp.com Много вопросов. Все не сосчитать!
Полезность 5 из 5.
2)http://www.whizlabs.com/scjp/scjp.html 14 вопросов c объяснениями. Нужна регистрация.
Полезность 4 из 5.
3)http://www.quizful.net/test Нужна регистрация + нужно заработать балы(чтобы пройти scjp) вкладом в развитие сайта(например статью написать) . В основном материал по java 1.4. Если нету лишних часов - лучше не заморачиваться.
Полезность 3 из 5.
4)http://www.ucertify.com 15 вопросов. Нужно устанавливать вражеский ехе. Вопросы содержат некорректные имена, местами перепутаны ответы.
Полезность 3 из 5.
РАЗНОЕ
IO/NIO
java.util.Scanner
FileChannel
FileReader
ЗЫ.
Экзамен не включает вопросы про побитовые операции/сдвиги и тп.
среда, 29 сентября 2010 г.
BufferedImage getType() returns 0
0 это BufferedImage.TYPE_CUSTOM. С таким типом ряд операций(ресайз/скэйл и тп) с изображением сделать проблематично - все попытки закончатся
- java.lang.IllegalArgumentException: Unknown image type 0
Фигня возникла при работе с PNG, причём для одинаковых файлов на разных java машинах возвращался разный тип(TYPE_3BYTE_BGR(5) на jdk 1.6.0_19 и TYPE_CUSTOM(0) на jdk 1.6.0_13 ) .
Для получения BufferedImage использовался
ImageIO.read(new File(configuration.getPath()))
Нашёл следующее лекарство - определять тип картинки ручками. Лекарство видимо будет помогать только при некоторых случаях. Тип определяется так:
bufferedImage.getColorModel().hasAlpha() ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR;Лекарство нашёл тут:
вторник, 31 августа 2010 г.
Двойной диспатч как средство борьбы с неопределённостью типов при компиляции
-----------------------------------------------------
...Ласковое дуновение ветра коснулось выдубленной солнцем и непогодой красной кожи седого индейца. Он поморщился, как будто почувствовал в воздухе что-то неприятное, и вытянув губы в трубочку начал что то насвистывать себе под нос. Белый человек сидящий напротив него поднял глаза от костра, упёрся взглядом в грубую тунику седого и задумчиво сказал
- Ты прав Бычий Хуй. Есть что то в двойном диспатче.
Бычий Хуй ничего не ответил. Смотря на пламя костра и продолжая насвистывать странную мелодию он полез за трубкой...
------------------------------------------------------
Двойной диспатч можно любить или не любить. Но ввиду особенностей работы c Java, есть несколько ситуаций, когда без него просто не обойтись. Например когда класс, параметризующий вызов метода, неизвестен при компиляции.
Пример:
...Ласковое дуновение ветра коснулось выдубленной солнцем и непогодой красной кожи седого индейца. Он поморщился, как будто почувствовал в воздухе что-то неприятное, и вытянув губы в трубочку начал что то насвистывать себе под нос. Белый человек сидящий напротив него поднял глаза от костра, упёрся взглядом в грубую тунику седого и задумчиво сказал
- Ты прав Бычий Хуй. Есть что то в двойном диспатче.
Бычий Хуй ничего не ответил. Смотря на пламя костра и продолжая насвистывать странную мелодию он полез за трубкой...
------------------------------------------------------
Двойной диспатч можно любить или не любить. Но ввиду особенностей работы c Java, есть несколько ситуаций, когда без него просто не обойтись. Например когда класс, параметризующий вызов метода, неизвестен при компиляции.
Пример:
import org.junit.Test; public class TestABC { static class A { } static class B extends A { } static class C extends A { void print(ABC abc) { abc.print(this); } } static class ABC { void print(A a) { System.out.println("a"); } void print(B b) { System.out.println("b"); } void print(C c) { System.out.println("c"); } } @Test public void test() { ABC abc = new ABC(); A a = new A(); B b = new B(); C c = new C(); //---------------------- System.out.println("-----------------------"); abc.print(a); abc.print(b); abc.print(c); //----------------------- System.out.println("-----------------------"); //будет вызван только метод void print(A a) abc.print(a); abc.print((A) b); abc.print((A) c); //----------------------- System.out.println("-----------------------"); ((A)c).print(abc);//вот он красавец - двойной диспатч } }
Вывод:
-----------------------
a
b
c
-----------------------
a
a
a
-----------------------
c
-----------------------
a
b
c
-----------------------
a
a
a
-----------------------
c
Подписаться на:
Сообщения (Atom)