質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

2375閲覧

paiza.ioで二分探索法のアルゴリズムを書いてTimeoutになる。

whitehorse85921

総合スコア34

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2019/07/09 05:27

編集2019/07/09 06:00

前提・実現したいこと

配列内のデータ「31」からTimeoutになるのと、配列内に無いデータを入力するとTimeoutになるのですが、目的のデータが配列のどこにあるのかを出力したいです。

発生している問題・エラーメッセージ

Timeout

エラーメッセージ

エラーメッセージは無いです。

該当のソースコード

Java

1 2ソースコード 3class Main{ 4 static int binSearch(int[] array,int key){ 5 int head=0; 6 int tail=6; 7 8 do{ 9 int center=(head+tail)/2; 10 if(array[center]==key){ 11 return center; 12 }else if(array[center]<key){ 13 head=center++; 14 }else{ 15 tail=center--; 16 } 17 }while(head<=tail); 18 return -1; 19 } 20 public static void main(String[] args){ 21 int[] array={11,13,17,19,23,29,31}; 22 int target=31; 23 24 int index=binSearch(array,target); 25 26 if(index !=-1){ 27 System.out.println(index+"番目の要素が一致"); 28 }else{ 29 System.out.println("見つかりませんでした"); 30 } 31 } 32}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

https://paiza.io/projects/RndYNPPLtbJt55OwdCDALg

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/09 05:31

第三者に聞いていい問題なのでしょうか?
dice142

2019/07/09 05:41

仕事かどうかではなく、Paizaの利用規約に引っかかるかどうかですね。 Paizaの利用規約の禁止行為を確認してください。
whitehorse85921

2019/07/09 05:42

paizaの問題じゃないですよ。paiza.ioはネット上でコードが書けるサービスです。
dice142

2019/07/09 05:44

あ、失礼しました。 paiza.ioでpaizaの問題を解いていての質問かと早とちりしました。
maisumakun

2019/07/09 05:45

何かの問題だと思っていました。失礼しました。
m.ts10806

2019/07/09 05:46 編集

とりあえずスペルミスはありますね intdex ↓ index
whitehorse85921

2019/07/09 05:46

前後してしまってすみません。アドバイスありがとうございます。
m.ts10806

2019/07/09 05:47

質問は編集できますので、ご自身が試されたpaiza.ioの実行結果で得られるURLを質問本文にご提示ください。
whitehorse85921

2019/07/09 06:01

時間がかかってすみません。このサイト久しぶりに使ったので、編集に時間がかかりました。
m.ts10806

2019/07/09 06:06

解決されたようですね。 ただ、回答していない私が言うのもなんですが、今回は「結局どのようにして解決に至ったか」は気になります。もしかしたら回答者の意図通りの対応ではないかもしれないし。 そのあたりは詳細をコメントしてあげてください。 https://teratail.com/help/question-tips#questionTips4-2
whitehorse85921

2019/07/09 06:12

分かりました。詳細にコメントしてみます。アドバイスありがとうございます。
guest

回答2

0

ベストアンサー

インクリメントやデクリメントが後置であるため、headとtailが隣り合わせの状態で見つからない場合、そこからheadもtail全く動かなくなります。インクリメント、デクリメントを前置にするか、+1,-1で普通に式を書くかする必要があります。

投稿2019/07/09 05:42

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitehorse85921

2019/07/09 05:57

ありがとうございます!できました。
whitehorse85921

2019/07/09 07:45

最初は、メソッドを使わずにwhile文とif-else文だけで書いていました。 でも、それでは配列にデータがなかった時に「見つかりませんでした」と出力できないことに悩みました。それで、ネットや本を調べてみてメソッドを作れば、配列にデータがないときの処理ができると分かりました。それで配列内に目的のデータを探すメソッドを書き、出力したのですがインデックスが5に入っているデータが出てこないことと、配列内にないデータが「見つかりませんでした」と出力されないことに悩みました。そこでswordoneさんの仰ったように書いたら動いたのですが、なぜ、動いたか分かりませんでした。そこでググってみて「前置」の場合は式ないしメソッドの評価を行う前にインクリメントやデクリメントを行うというのを見つけて一時間以上考えて、ググったのですが分からなかったので、詳細なコメントができるまで少し時間をください。すみません。
guest

0

head、tail、centerの値をループ毎に出力してみて、動作を追ってみてはいかがでしょうか。

Java

1int i = 0; 2do{ 3 int center=(head+tail)/2; 4 System.out.printf("%d, %d, %d\n", head, center, tail); 5 ... 6 7 if(i++ > 20) break; 8} while(head<=tail);

想定どおりに動作していない筈です。

例えば、

Java

head=center++;

この書き方だとheadにはcenterの値がそのまま代入されています。

コメントを受けて:実験

Java

1class Main { 2 public static void main(String[] args) { 3 { 4 // ただの足し算 5 int a = 10; 6 int b; 7 8 b = a + 1; 9 System.out.printf("a=%2d, b=%2d\n", a, b); // => a=10, b=11 10 } 11 { 12 // 前置インクリメント 13 int a = 10; 14 int b; 15 16 b = ++a; 17 System.out.printf("a=%2d, b=%2d\n", a, b); // => a=11, b=11 18 } 19 { 20 // 後置インクリメント 21 int a = 10; 22 int b; 23 24 b = a++; 25 System.out.printf("a=%2d, b=%2d\n", a, b); // => a=11, b=10 26 } 27 } 28}
  • b = a + 1

aの値は勝手に更新されない。bにはaに1を足した数が代入される。

  • b = ++a

aの値は1だけ大きくなり、その値がbに代入される。

  • b = a++

aの値がbに代入された後、aの値は1だけ大きくなる。

投稿2019/07/09 05:41

編集2019/07/09 08:22
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitehorse85921

2019/07/09 07:59

動作を追ってみました。center++やcenter--だと、探したいデータが31のとき、インデックス番号が5,5,6で止まったままで動きませんでした。++centerや--centerの時は、0, 3, 6 4, 5, 6 6, 6, 6となりました。なぜcenter++やcenter--だと動かないのか一時間以上ググって考えましたが分かりませんでした。すみません。
whitehorse85921

2019/07/09 11:15

きめ細やかにありがとうございます。 前置と後置では、加算、減算するタイミングがそれぞれ違うのですね。 center++;だと、centerがheadに代入された後にcenterの値が1だけ大きくなるので、例えば、探したい目的のデータのあるインデックスが5の場合、後で加算されてからではタイミングが遅いので、headにcenterの値5がそのままなのかなと思いました。間違って解釈していたらすみません。
LouiS0616

2019/07/10 01:07

ご提示のコードでは毎周centerを上書きしているので、 b = center++ は b = center に、 b = ++center は b = center + 1 に置き換えても同じように動作します。
whitehorse85921

2019/07/10 08:59

tail=center--;もtail=centerになるのですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問