|
|
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Здесь я нашёл неработающее решение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ORA-32033: unsupported column aliasing. А кто-нибудь пробовал решить эту задачу на sql? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:10:47 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Просто, версия просто у вас не та... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:24:53 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
xtender, у меня 10.2.0.3. А какая нужна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:36:16 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Просто, Версию решения, скорей всего имел ввиду xtender. Здесь посмотрите Задача о восьми Ферзях на Oracle SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 10:46:16 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Вот как бы быстро реализовать маску ферзя со смещением? ))) То есть просто число в десятичной системе, из 64-х бит, где выставленные биты означают битое ферзем поле. Далее берем ферзя и его 64 возможных позиции на доске + эту маску со смещением для каждой позиции. Берем второго фрезя тоже с его маской+(смещение по позиции) и достаем только те его позиции, bitand которых с маской первого фрезя равно нулю + делаем bitor его маски с маской первого фрезя Далее так же берем третьего фрезя, снова достаем все его позиции, bitand позиций которых с суммарной маской полученной на прде. шаге равно нулю и так далее 8 ферзей. Можно конечно написать отдельную функцию, которая для каждой позиции будет возвращать число-матрицу, можно подзапрос, но подзапрос у меня получается какой-то... Некрасивый в общем, чую, можно написать коротко и красиво, как в примерах ) Вероятно, я чего-то не понял просто, и именно так все и реализовано здесь, но у меня просто ни один из примеров не сработал пока (11.2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 14:53:26 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Нет. Вру. Работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2013, 14:57:47 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Я имел в виду вот такого рода запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. Так вот интересный момент (для меня). Когда запускаю этот запрос, то не могу дождаться окончания его выполнения (хинты тоже пробовал типа материализовать самый первый запрос (хотя по плану он итак пишется в темп), но в общем или не те, или в принципе это бесполезно). Для меня очевидно, что кол-во переборов в таком варианте должно быть очень небольшим на каждой итерации, но запрос виснет. А вот если самый первый запрос (с матрицами битых полей для каждой позиции) сразу зафигачить в табличку: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И потом уже выполнить этот же самый запрос, но обращаясь к готовой табличке с матрицами: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. То запрос выполняется моментально. То есть получается, что: - сама таблица с матрицей полей создается за доли секунды - запрос на основе этой таблички выполняется тоже за доли секунды А вот если написать как в изначально варианте одним запросом, то все висит. Колдуны, подскажите, как нормально написать запрос? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 09:42:15 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
/*+ RULE*/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:02:31 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:08:30 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
materialize+ordered Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:12:53 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Elic , пробовал (но только самом изначальном запросе) не помогло. The_beginner , RULE дало результат - 4 секунды уже кое-что, возможно большего уже и не выжать. Хотя все равно создание таблички + запрос на ее основе в сумме меньше секунды... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:16:00 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
хотя порядок исправляется сам если воткнуть материализацию в f2 вместо f ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:18:00 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
xtender , +ordered тоже 4 секунды. В общем и целом наверно и нормально хз, хотя все же смущает факт, описанный в момем пред. каменте. Про leading потыкаю на досуге ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:19:30 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Матрица ферзя, сколько вот так? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:23:00 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
xtender , удивительно, но да. Цель достигнута (меньше секунды просто materialize, но в f2): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. Всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:23:14 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Ну и если materialize прописать вообще для каждого ферзя, то еще в 4 раза быстрее в районе 0.2с): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:32:54 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Матрица ферзя, Тупо перебором по orawish Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:44:26 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
воткактотак , не понял правда что означает приведенный запрос ). Или если это об условяих not in в целом, то их можно убрать (это так... мелочь - плюс какие-то еще доли секунды выигрвает и все), и без not in будет работать тоже за 0.2сек :): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. Но мож что-то другое имели в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 10:56:53 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Убрал все лишнее из запроса - время 0.15с: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Но есть предчувствие, что этот запрос можно написать еще более кратко, - как-то законнектбаить само добавление ферзей, тогда его и масштабировать будет проще да и просто лучше смотреться будет ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 12:13:52 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Матрица ферзя, можно попробовать вместо materialize добавить поле rownum везде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 12:15:54 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
xtenderможно попробовать вместо materialize добавить поле rownum везде 0.4-0.5с ): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Потыкать бы еще всторону уменьшения самого запроса, как-то законнектбаить добавление ферзей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 12:22:35 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Кстати вру - не 0.4-0.5 а уже 0.14-0.15с ) В общем теперь точно это сопоставимо по времени с созадние таблички+запрос к этой табличке. Осталось еще попробовать сам запрос переписать так, чтобы добавление ферзей в цикле сделать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 12:30:13 |
|
||
|
Задача о восьми ферзях
|
|||
|---|---|---|---|
|
#18+
Хорошая задачка. У меня чуток побыстрее получилось ( менее 0.1 ): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2014, 16:39:09 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=38499809&tid=1888093]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
212ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 530ms |

| 0 / 0 |
