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

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

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

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2927閲覧

トーナメント表を実装する場合、データ構造をどう定義しますか?

takezoux2

総合スコア6

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/05/24 16:25

編集2021/05/26 16:50

前提・実現したいこと

トーナメント表を表示したい場合、そのトーナメント表の情報をどのように保持しますか?

RDBに保存可能なデータ構造でみなさんの設計を知りたいです。
データ構造なので、言語は問いません。より良いデータ構造の定義を知りたいです。

定義例

保存する場合は、どちらもEntryテーブルとMatchテーブルを作成

例1: 前の試合を保持

typescript

1 2interface Entry{ 3 id: string 4 entryName: string 5} 6interface Match { 7 id: string 8 matchName: string 9 nodeId1: string 10 nodeId2: string 11} 12 13[ 14 {id: "E1", entryName: "田中太郎"} , {id: "E2", entryName: "鈴木一郎"}, 15 {id: "M1", matchName: "第一試合", nodeId1: "E1", nodeId2: "E2"}, 16 {id: "E3", entryName: "山田花子"} , {id: "E4", entryName: "佐藤櫻子"}, 17 {id: "M2", matchName: "第二試合", nodeId1: "E3", nodeId2: "E4"}, 18 {id: "M3", matchName: "決勝", nodeId1: "M1", nodeId2: "M2"}, 19] 20

例2: 次の試合を保持

Scala3

1 2case class Entry( 3 id: string, 4 entryName: string, 5 matchId: string 6) 7case class Match( 8 id: String 9 matchName: String 10 nextMatchId: Option[String] 11) 12 13List[Entry | Match]( 14 Entry("E1", "田中太郎", "M1"), Entry("E2", "鈴木一郎", "M1"), 15 Match("M1", "第一試合", Some("M3")), 16 Entry("E3", "山田花子", "M2") , Entry("E4", "佐藤櫻子", "M2"), 17 Match("M2", "第二試合", Some("M3")), 18 Match("M3", "決勝", None), 19) 20

例3: コメント頂いたナイーブツリー

python3

1from dataclasses import dataclass 2 3WINNER = 1 4LOSER = 2 5 6@dataclass 7class Node: 8 id: str 9 nextId: str 10 name: str 11 winner: int 12 13[ 14 Node("E1","M1","田中太郎", WINNER), 15 Node("E2","M1","鈴木一郎", LOSER), 16 Node("M1","M3","第一試合", 0), 17 Node("E3","M2","山田花子", 0), 18 Node("E4","M2","佐藤櫻子", 0), 19 Node("M2","M3","第二試合", 0), 20 Node("M3",None,"決勝", 0) 21] 22

例4: コメント頂いたそのままシリアライズ(型付き言語の場合)

c#

1public class Match { 2 public string Name {get; set;} 3 public Match[] Entries {get; set;} 4} 5 6new Match{ 7 Name = "決勝", 8 Entries = new Match[]{ 9 new Match { 10 Name = "第一試合", 11 Entries = new Match[]{ 12 new Match { 13 Name = "田中太郎", Entries = new Match[0] 14 }, 15 new Match { 16 Name = "鈴木一郎", Entries = new Match[0] 17 } 18 } 19 }, 20 new Match { 21 // 略 22 } 23 } 24} 25

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

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

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

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

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

SaitoAtsushi

2021/05/24 16:40

「漠然とした興味から票を募るような質問」は推奨されません。 https://teratail.com/help/avoid-asking ご自身が考えた例に対してどのような問題があって解決されなければならない問題は何であるかを明確にするのが望ましいです。
rysh

2021/05/24 20:29

データ利用方法の想定はありますか?
rysh

2021/05/24 20:46 編集

ちなみに僕は十分に明確だと思いました > 何か困っている理由があり、最適解を見つける為の知見を得たい場合は、その理由や何が知りたいのかを明確に記述してください。 ただタグは、RDBを入れて、言語問わないと書いているので特定言語のタグは外した方が良いかもしれないですね。
m.ts10806

2021/05/25 00:59

Java,C++は本件とはどう関係するのでしょう
takezoux2

2021/05/26 16:53

>> rysh トーナメント表をさっと表示できるプログラムを作ろうとしているだけで、具体的な想定は無いです。 >> m.ts10806 言語関係ないと言われたので、関係するようにしました!
guest

回答2

0

トーナメント表は試合をナイーブツリーで表すことが出来ます。
この際、ツリー構造で表すのには次の試合のみで良いかと思います。
※逆を辿ることは無いと思いますし、あったとしても逆にたどれば良いだけですし。
また、勝者(勝敗の情報)の情報は必要でしょう。

出場者に関しては、最初の試合さえあれば、後はトーナメント表から情報を得ることが出来ます。

投稿2021/05/25 01:39

編集2021/05/25 01:46
sazi

総合スコア25327

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

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

0

ベストアンサー

トーナメント表はツリー構造に見えるのでツリー構造をRDBに入れるパターンをそのまま使えば良いのかなと思いました。

あるいは、一般的なスポーツ大会や興行を想定する場合、データ量が少なく部分的な検索や頻繁な更新もないと考えられるため、シリアライズして1レコードに入れても良いかと思いました。

より詳しくはこちらの[書籍](プログラマのためのSQLグラフ原論 リレーショナルデータベースで木と階層構造を扱うために https://www.amazon.co.jp/dp/4798144576/ref=cm_sw_r_cp_api_glt_i_S46FWETRTX3FRCCGQ89Z)に書いてあるので良かったら参考にしてください。

また、データ量が増えたり頻繁に更新が発生するようなケースではRDBを諦めてNeo4jなどのグラフDBを検討すると良いかと思います。

投稿2021/05/24 20:34

編集2021/05/24 20:59
rysh

総合スコア874

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問