• ベストアンサー

データ構造のmapとは?

mapとはなんでしょうか?英語の意味は写像ですが、 "キーと値が一対一で結びついているもの"で良いでしょうか? set,table,listの違いについても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

まあ構造としては「木はグラフの特殊なもの」「パスは木の特殊なもの」なので グラフ構造 > 木構造 > リスト構造 ではありますが, 普通はそれぞれ適切なものを使うと思います. リストを表現するときにグラフ構造を使うことは可能かもしれないけど, かなり無駄な感じ.

noname#68570
質問者

お礼

回答ありがとうございます。 なんかちゃんと定義されていないのって気持ち悪いんですよねぇ。 スッキリするまでグラフ理論を勉強しようと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • castable
  • ベストアンサー率0% (0/1)
回答No.1

・map 「キーと値のペア」の集まりで、キーに対して値が一意に定まるもの(キーの重複が許されないもの)。 値の重複は許されるので、一対一だけでなく多対1の関係も含みます。 ・set 値の集まりで、値の重複が許されないもの。 mapにおけるキーと値をひとかたまりとみなせば、同じようなもの、と考えることもできると思います。 数学で言うところの集合→set、写像→mapでよいと思います。 ・table/list mapとsetが論理的で、機能に言及した分類(どのような制約があるか等)であることに比較すると、table/listは、実装方法による分類というイメージになります。 キーや値の重複を許す/許さないといった点には言及せず、計算コスト(特定の値を持つ要素を見つけるのにどれだけ時間がかかるか等)が(データ構造の)利用者から見えるものとして定められます。 すごく実装を意識して説明すると、 ・table 値の集まりで、値が連続的な領域に配置されているもの。 (連続的な領域に配置されていて、位置が既知のため)任意の値にダイレクトにアクセスできる。 映画館の座席の番号とか、マンションの部屋番号とか、番号が分かれば位置が直接特定できるようなイメージです。 ・list 値(要素)の集まりで、ある要素からは、その近隣(次、とか前とか)の要素にしかアクセスできない。 一般に、鎖状(1次元)の構造を成す。 よいイメージが思いつきませんが。。。 車内に路線図のない路線バスに乗って「次は○○です」といわれるのを聞きながら目的地に到達するような感じです。。分かりづらいですね^^;; 参考までに、、 機能的な面に着目したデータ構造というと、他にはキューやスタックなどがあります。 実装、構造に着目したデータ構造というと、他には木(tree)構造やグラフがあります。 C++を勉強中でしたら、標準テンプレートライブラリ(STL)の書籍等で分かりやすく説明されているのではと思います。

noname#68570
質問者

お礼

詳しい回答ありがとうございます。 すっきりしました。

noname#68570
質問者

補足

もう一つ疑問なのですが、 リスト構造はツリー構造の一種なのでしょうか? ○<->○<->○<->○ 分類すると グラフ > ツリー構造 > リスト構造 なのでしょうか? 回答して頂いて大変あつかましいのですが、宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MapからListへ

    どなたか教えてください。 Mapからあるvalueの値のkeyの値をListへ追加していきたいのですがどのようにしたらよいでしょうか? testmap.put(1,TEST1) testmap.put(2,TEST2) testmap.put(3,TEST1) ・ ・ ・ testmapのvalue値「TEST1」のkey1、3をListへ追加したいです。

    • ベストアンサー
    • Java
  • android CSVファイルのデータを

    初心者ですが宜しくお願いします。 やりたい処理えですが、CSVファイルのデータをHashMapにセットしたいのです。 現在は下記のように直接値をセットしています。 この値をCSVからセットするにはどうすればよいでしょうか? HashMap<String, String> map = new HashMap<String, String>(); // キーと値のペアを格納 map.put( "Key1", "あ1001" ); map.put( "key2", "い1002" ); map.put( "Key3", "う1003" ); map.put( "key4", "え1004" ); map.put( "key5", "err" ); ------------------------------------ value.csv "key2", "い1002" "Key3", "う1003" "key4", "え1004" "key5", "err" ------------------------------------ 上記csvファイルを作り、読み込むところまではわかります。 ヒント、参考サイトや参考書の情報でもかまいません。 どうぞよろしくおねがいいたします。

    • ベストアンサー
    • Java
  • std::mapの要素を別のキーに移動したいのですがどうしたら良いでし

    std::mapの要素を別のキーに移動したいのですがどうしたら良いでしょうか。 例 map<int, list<string>> m; キー|値 1 |"aaa","bbb" 2 |"ccc" ↓ キー|値 2 |"ccc" 3 |"aaa","bbb" 検索して削除して挿入を考えましたがもっと効率の良い方法はあるのでしょうか?

  • MAPに関して

    以下のように、マップにCLASS_Aのリストのリストを格納しています。 CLASS_A { private int a getter setter } MAP<String,List<List<CLASS_A>>> map = new HashMap<String,List<List<classA>>> キーを元に、マップからリストのリストを取得した場合に CLASS_Aからint aを取得する場合 for List<List<CLASS_A> a : DaoList(Daoの取得結果)) for List<CLASS_A> b : a) b.get() } } でよろしいでしょうか? (2重ループになってしまうので、もっと簡単な取得方法あったら教えてください)

  • Mapの要素の削除と挿入

    こんにちは。 Listに挿入されたMapでKeyがFLGのValueが1のものを List要素ごと削除しFlgが0のものに新しくmap.put("LBL","○");したいのですがどうもうまくいきません。 getListMap()はTestListクラスにあるMapの挿入されたリストを返すメソッドです。 よろしくお願いします。 Mapの中身はこのようになっています。 [key=TYPE:value=AAA0] [key=NO:value=000] [key=FLG:value=1] [key=TYPE:value=AAA1] [key=NO:value=001] [key=FLG:value=0] [key=TYPE:value=AAA2] [key=NO:value=002] [key=FLG:value=1] [key=TYPE:value=AAA3] [key=NO:value=003] [key=FLG:value=1] [key=TYPE:value=AAA4] [key=NO:value=004] [key=FLG:value=1] [key=TYPE:value=AAA5] [key=NO:value=005] [key=FLG:value=0] [key=TYPE:value=AAA6] [key=NO:value=006] [key=FLG:value=1] [key=TYPE:value=AAA7] [key=NO:value=007] [key=FLG:value=0] [key=TYPE:value=AAA8] [key=NO:value=008] [key=FLG:value=1] [key=TYPE:value=AAA9] [key=NO:value=009] [key=FLG:value=1] public class Test { public static void main(String[] args) { TestList tl = new TestList(); List list = tl.getListMap(); for (int i = 0; i < list.size() ; i++){ Map map = (Map)list.get(i); Set keyset = map.keySet(); Iterator it = keyset.iterator(); System.out.println("-------------------"); while(it.hasNext()){ Object key = it.next(); if(map.get(key)=="1"){ list.remove(i); }else{ map.put("LBL","○"); } System.out.print("[key=" + key); System.out.println(":value=" + map.get(key)+"]"); } } } }

    • ベストアンサー
    • Java
  • MAPコンテナの宣言部分の表記に関して質問です

    C++でSTLのMAPを勉強しだしたのですが、 よく分からない部分を見つけました。 以下のようにmapを使う際に、 mapコンテナの宣言をするのは理解できたのですが、 map<string, int> mmbr ; // (string型,int型)の対データを管理 map<int, int> ikk ; //(int型,int型)の対データを管理 他人が作成したサンプルを見ていたら、 以下のようにmapのコンテナ宣言がされていました。 ********************************************************* typedef KEY key_type; typedef typename std::map<key_type, value_type> container_type; ********************************************************* 1行目でtypedefしているだけなので理解できるのですが、 2行目で行っているmapコンテナの宣言の意味が どうも意味が分からないでいます。 mapコンテナの宣言で、 <string, int>や<int, int>のようにせず、 <key_type, value_type>としているのは、 どういう意味なのでしょうか? どうぞ宜しくお願い致します。

  • Mapに登録した値を登録した順に取り出したいです。

    Mapに登録した値を登録した順に取り出したいです。 TreeMapを使えば順番に取れるという風に書いてありましたが、 どうもキーの昇順で出ているようで、こちらの希望する出し方ができません。 私は登録した順番で取りたいのですが、どの様にすればよいでしょうか。 ちなみに、マップのキー、値ともにString型です。

    • ベストアンサー
    • Java
  • 「コレクション」の違い

    こんにちわ、コレクションの中で色々違いがわからないものがあるので質問させてください。 本題に入る前に確認ですが、List、Set、Mapは、 左から重複OK、重複NG、重複NG&キーで管理という考えでいいでしょうか? もし考え方が違っていたらご指摘ください。 本題に入らせていただきたいのですが、色々とある中の違いを教えてください。 ・ArrayListとLinkedList ・HashSet(Map)とTreeSet(Map) この違いがわかりません。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • ListからMapを作成 MapのValueにはListをput

    すみません、どなたか教えて下さい。 あるListからMapを作成したく、同じkeyが存在する場合、valueのListへ値を追加したいですのですがConcurrentModificationExceptionエラーが返されてしまいます。エラーを返さないように変数を使い分け工夫したつもりですが。。。((1)でmapAにもaddされている!?)他に良い方法はないでしょうか? Map mapA = new TreeMap(); Map mapB = new TreeMap(); Iterator it = listA.iterator(); while (it.hasNext()) { Bean bean = (Bean)it.next(); List mapvaluelist = new ArrayList(); if (mapA.size()==0){ mapvaluelist.add(bean); mapA.put(bean.getName(),mapvaluelist); }else{ if (mapB.size()!=0){ mapA = mapB; } Set keyset = mapA.keySet(); Iterator itmap = keyset.iterator(); while (itmap.hasNext()){ String mapkey = (String)itmap.next(); if (bean.getName().equals(mapkey)){ mapvaluelist = (List)mapA.get(mapkey); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); (1) }else{ mapvaluelist.clear(); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); } } } }

  • STLのmapを使ってコードを書き換える

    問題文説明とコードは長いので、リンク先のページでまとめました。 http://codepad.org/M5yyvUud 問題文通りのプログラムをstd::setを使って書いてみたのですが、このコードをstd::setではなく、std::mapを使って書き換えるにはどのようにすればよろしいでしょうか? mapを使ってキーとコードを関連付けて、この単語にはこの数値が格納されていると調べれるようにしたいです。 setの時のように上手く組めず悩んでいます。 ご教授よろしくお願いいたします。