Java データ構造とアルゴリズム分析 (VIII) - スプレー ツリー

Java データ構造とアルゴリズム分析 (VIII) - スプレー ツリー

ストレッチツリーの紹介

スプレー ツリーは特殊な二分探索ツリーです。

特別なのは、バイナリ検索ツリーであることに加えて、ノードにアクセスすると、スプレーツリーがノードを回転させてルートにする機能も備えていることです。これを行う利点は、次回ノードにアクセスするときに、ノードにすばやくアクセスできることです。

特性

  1. 通常の二分探索木と比較すると、あらゆる状況でのあらゆる操作に対して償却複雑度が O(log2n) であり、時間パフォーマンスが優れています。
  2. 赤黒木や AVL 木などの一般的なバランス型二分木と比較すると、追加ノード情報が少なく、空間パフォーマンスが優れ、プログラミングの複雑さが低くなります。
  3. 多くの場合、検索操作では、後続のクエリは前のクエリと高い相関関係があります。このように、各クエリ操作ではノードがツリーのルート ノードに回転されるため、次のクエリ操作を迅速に完了できます。
  4. 区間に対してクエリ、変更、削除などの操作を行うことができ、セグメント ツリーとツリー配列のすべての機能を実現できます。

回転

スプレー ツリーは、スプレー ツリーに対する各クエリ、変更、および削除操作の後に回転操作 Splay(x, root) を実行し、ノード x をツリーのルートに回転させることにより、O(log2n) の償却複雑度を実現します。

ストレッチ ツリーには 6 種類の回転があります。ミラー イメージの重複が削除されると、ジグ (ザグ)、ジグジグ (ザグザグ)、ジグザグ (ザグジグ) の 3 種類になります。

1 下から上に回転する

1.1 ジグザグ回転

図に示すように、x ノードの親ノードは y であり、x は y の左の子ノードであり、y ノードはルートです。 x ノードを y の親ノードにするには、x ノードに対して右回転 (ジグ操作) を実行するだけで済みます。これにより、x はスプレー ツリーのルート ノードになります。

1.2 ジグジグ回転

上図に示すように、x ノードの親ノード y と y の親ノード z は直線チェーン上にあります。このとき、まずyノードとzノードにジグ回転を行い、次にxノードとyノードにジグ回転を行うと、最終的に右図のようになり、xはyとzの祖先ノードになります。

1.3 ジグザグ回転

上図に示すように、x ノードの親ノード y と y の親ノード z はジグザグ チェーン上にあります。このとき、x ノードと y ノードは最初にジグ回転し、次にザグ回転して、最終的に右図のようになり、x は y と z の祖先ノードになります。

2 上から下に回転する

このアプローチでは、ノードが親ノードへの参照を格納する必要はありません。ツリーを下に向かってノード x を検索すると、検索パス上にあるノードとそのサブツリーが削除されます。 2 つの一時的なツリー (左のツリーと右のツリー) を構築します。削除されていないノードで構成されるツリーは、中央値ツリーと呼ばれます。

  1. 現在のノードxはツリーのルートです
  2. 左木Lはxより小さいノードを格納する。
  3. 右木Rはxより大きいノードを格納する

最初は、x はツリー T のルートであり、左のツリー L と右のツリー R は両方とも空です。 3 つの回転操作:

2.1 ジグザグ

図に示すように、x ノードの子ノード y が探しているノードです。y ノードを右回転 (ジグ操作) して x の親ノードにするだけで、y をスプレー ツリーのルート ノードにすることができます。中央のツリーのルートとして y を使用します。同時に、x ノードを右のツリー R に移動します。明らかに、右のツリーのノードは、検索するノードよりも大きいです。

2.2 ジグジグ回転

上図に示すように、x ノードの左の子ノード y と y の左の子ノード z は直線上にあり、検索対象のノードは z ノードをルートとするサブツリー内にあります。このとき、x ノードと y ノードをジグザグにし、次に z と y をジグザグにして、z を中央のツリーのルートにし、y とそのサブツリーを右側のツリー R にマウントします。

2.3 ジグザグ回転

上図に示すように、x ノードの左の子ノード y と y の右の子ノード z はジグザグ チェーン上にあり、検索対象の要素は z をルートとするサブツリー内にあります。このとき、まず x ノードと y ノードにジグ回転を実行し、x とその右サブツリーを右ツリー R にマウントします。このとき、y は中央ツリーのルート ノードになります。次に、z ノードと y ノードにザグ回転を実行し、z が中央ツリーのルート ノードになるようにします。

2.4 マージ

最後に、ノードが見つかった後、または空のノードに遭遇した後、左、中央、右のツリーをマージする必要があります。図に示すように、左のツリーは中央のツリーの左下にマウントされ (トラバーサル順序の要件を満たしています)、右のツリーは中央のツリーの右下にマウントされます (トラバーサル順序の要件を満たしています)。

スプレイツリーの実装

1. ノード

  1. パブリッククラスSplayTree<TはComparable<T>>を拡張します{
  2. private SplayTreeNode<T> mRoot; // ルートノード
  3.  
  4. パブリッククラスSplayTreeNode<TはComparable<T>>を拡張します{
  5. T key ; // キーワード (キー値)
  6. SplayTreeNode<T> left ; // 左の子
  7. SplayTreeNode<T> right ; // 右の子
  8.  
  9. パブリックSplayTreeNode() {
  10. this.left = null ;
  11. this.right = null ;
  12. }
  13.  
  14. パブリックSplayTreeNode(Tキー、SplayTreeNode<T>、SplayTreeNode<T>) {
  15. this.key =キー;
  16. this.left =;
  17. this.right =;
  18. }
  19. }
  20. }

SplayTree はスプレー ツリーであり、SplayTreeNode はスプレー ツリー ノードです。ここでは、SplayTreeNode を SplayTree の内部クラスとして定義します。スプレー ツリー SplayTree には、スプレー ツリーのルート ノード mRoot が含まれます。 SplayTreeNode にはいくつかのコンポーネントが含まれています:

  1. key – スプレー ツリーのノードをソートするために使用されるキーワードです。
  2. left – 左の子です。
  3. 正しい – 正しい子供です。

2. 回転

  1. /*
  2. *キーに対応するノードをルートノードになるように回転し、ルートノードを返します。
  3. *
  4. * 知らせ:
  5. * (a): スプレーツリーに「キー値がキーであるノード」が存在します
  6. *キー値が key のノードを回転してルート ノードにします。
  7. * (b): スプレーツリーには「キー値がキーであるノード」が存在せず key < tree.keyです
  8. * b-1 「キー値がキーであるノード」の前身ノードが存在する場合、 「キー値がキーであるノード」の前身ノードをルートノードに回転します。
  9. * b-2 「キー値がキーであるノード」の先行ノードが存在する場合、そのキーはツリー内のどのキー値よりも小さいことを意味します。この場合、最小のノードがルートノードになるように回転します。
  10. * (c): スプレー ツリーには「キー値が key のノード」が存在せず key > tree. key です
  11. * c-1 「キー値がキーであるノード」の後継ノードが存在する場合、 「キー値がキーであるノード」の後継ノードをルートノードになるように回転します。
  12. * c-2 「キー値がキーであるノード」の後継ノードが存在しない場合は、そのキーがツリー内のどのキー値よりも大きいことを意味します。この場合、最大のノードがルートノードになるように回転します。
  13. */
  14. プライベートSplayTreeNode<T> splay(SplayTreeNode<T> ツリー、Tキー) {
  15. ツリーがnull場合
  16. ツリーを返します
  17.  
  18. SplayTreeNode<T> N = 新しい SplayTreeNode<T>();
  19. スプレイツリーノード<T> l = N;
  20. スプレイツリーノード r = N;
  21. スプレイツリーノード c;
  22.  
  23. のために(; ; ) {
  24. int cmp = key .compareTo(tree.key ) ;
  25. (cmp < 0) の場合 {
  26. もし(キー.compareTo(tree.left .key ) < 0) {
  27. c = tree.left ; /*右に回転*/
  28. ツリーの左端c.rightにします
  29. c.right = 木;
  30. ツリー = c;
  31. もしtree.leftnullならば
  32. 壊す;
  33. }
  34. r.left = tree; /*右にリンク*/
  35. r = 木;
  36. ツリー = tree.left ;
  37. }そうでない場合 (cmp > 0) {
  38.  
  39. もしtree.rightnullならば
  40. 壊す;
  41.  
  42. if ( key .compareTo(tree.right.key ) > 0) {
  43. c = tree.right ; /*左に回転*/
  44. ツリーの右端をc.left にします
  45. c.left = 木;
  46. ツリー = c;
  47. もしtree.rightnullならば
  48. 壊す;
  49. }
  50.  
  51. l.right = tree; /*左にリンク*/
  52. l = 木;
  53. ツリー = tree.right ;
  54. }それ以外{
  55. 壊す;
  56. }
  57. }
  58. l.right = tree.left ; /* アセンブル */
  59. r.left = tree.right ;
  60. ツリーの左端N.rightにします
  61. ツリーの右端をN.leftにします
  62.  
  63. ツリーを返します
  64. }
  65.  
  66. パブリックvoid splay(Tキー) {
  67. mRoot = splay(mRoot、キー);
  68. }

上記のコードの目的は、キー値が key のノードをルート ノードに回転し、ルート ノードを返すことです。処理には以下が含まれます:

(a): スプレーツリーに「キー値がキーであるノード」が存在します。

キー値 key を持つノードを回転してルート ノードにします。

(b): スプレー ツリーには「キー値がキーであるノード」が存在せず、キー < ツリー -> キーです。

b-1) 「キー値キーを持つノード」の前身ノードが存在する場合、「キー値キーを持つノード」の前身ノードをルートノードにローテーションします。

b-2) キー値 key を持つノードの先行ノードが存在する場合、そのキーはツリー内のどのキー値よりも小さいことを意味します。この場合、最小のノードがルートノードになるように回転されます。

(c): ストレッチ ツリーには「キー値がキーであるノード」が存在せず、キー > ツリー -> キーです。

c-1) 「キー値キーを持つノード」の後継ノードが存在する場合、「キー値キーを持つノード」の後継ノードをルートノードになるように回転します。

c-2) キー値 key を持つノードの後継ノードが存在しない場合は、そのキーがツリー内のどのキー値よりも大きいことを意味します。この場合、最大のノードがルートノードになるように回転されます。

それぞれを説明するために、次の例が示されています。

次のスプレイ ツリーで 10 を検索するには、「右回転」->「右リンク」->「組み合わせ」という 3 つの手順が含まれます。

01、右手

コードの「右回転」部分に対応

02、右リンク

コード内の「link right」の部分に対応

03. 組み合わせ

コードの「アセンブル」部分に対応する

ヒント: 上記のスプレイ ツリーで「70」を検索すると、「例 1」と完全に対称になり、対応する操作は「左に回転」、「左にリンク」、「アセンブル」になります。

「15 が b-1 の場合を見つける、5 が b-2 の場合を見つける」などの他の状況は比較的単純なので、自分で分析できます。

3. 挿入

  1. /**
  2. * ノードをスプレーツリーに挿入し、ルートノードを返します
  3. * @param tree 拡張ツリーのルートノード
  4. * @param z 挿入されたノード
  5. * @戻る 
  6. */
  7. プライベートSplayTreeNode<T>挿入(SplayTreeNode<T>ツリー、SplayTreeNode<T>z){
  8. int のCMP;
  9. SplayTreeNode<T> y = null ;
  10. ツリーノードを再生します。
  11.  
  12. // zの挿入位置を見つける
  13. (x != null ) の場合 {
  14. y = x;
  15. cmp = z.key.compareTo ( x.key ) ;
  16. (cmp < 0)の場合
  17. x = x.left ;
  18. そうでない場合 (cmp > 0)
  19. x = x.right ;
  20. それ以外{
  21. System.out.printf ( "同じノード(%d)を挿入することはできません!\n" z.key );
  22. ;
  23. ツリーを返します
  24. }
  25. }
  26.  
  27. y == null の場合
  28. ツリー = z;
  29. それ以外{
  30. cmp = z.key.compareTo ( y.key ) ;
  31. (cmp < 0)の場合
  32. y 左= z;
  33. それ以外 
  34. y 右= z;
  35. }
  36.  
  37. ツリーを返します
  38. }
  39.  
  40. パブリックボイド挿入(Tキー){
  41. SplayTreeNode<T> z = 新しい SplayTreeNode<T>(キー null null );
  42.  
  43. // 新しいノードの作成に失敗した場合は戻ります。
  44. ((z = new SplayTreeNode<T>( key , null , null )) == null )の場合
  45. 戻る;
  46.  
  47. // ノードを挿入
  48. mRoot = (mRoot,z)を挿入します
  49. // ノード (キー) をルートノードに回転します
  50. mRoot = splay(mRoot、キー);
  51. }

insert(key) は外部に提供されるインターフェースです。その機能は、新しいノード (ノードのキー値は key) を作成し、そのノードをストレッチ ツリーに挿入し、ノードを回転させてルート ノードにすることです。

insert(tree, z) は、ノード z をツリーに挿入するために使用される内部インターフェースです。 insert(tree, z) が tree に z を挿入する場合、tree はバイナリ検索ツリーとしてのみ扱われ、同じノードを挿入することは許可されません。

4. 削除

  1. /**
  2. *
  3. * @param ツリー拡張ツリー
  4. * @param key削除するノード
  5. * @戻る 
  6. */
  7. プライベートSplayTreeNode<T>削除(SplayTreeNode<T>ツリー、Tキー){
  8. スプレイツリーノード<T> x;
  9.  
  10. ツリーがnull場合
  11. 戻る ヌル;
  12.  
  13. //キー値 key を持つノードを検索し、見つからない場合は直接返します。
  14. if (search(tree, key ) == null )
  15. ツリーを返します
  16.  
  17. //キーに対応するノードを回転してルート ノードにします。
  18. ツリー = splay(ツリー、キー);
  19.  
  20. ツリーの左null場合
  21. // 「ツリーの先行ノード」をルートノードに回転します
  22. x = splay( tree.left key );
  23. // ツリーノードを削除する
  24. ツリーの右端カーソルを移動します
  25. }
  26. それ以外 
  27. x =ツリーの右;
  28.  
  29. ツリー = null ;
  30.  
  31. xを返します
  32. }
  33.  
  34. パブリックvoid削除(Tキー){
  35. mRoot = 削除(mRoot、キー);
  36. }

remove(key) は外部インターフェース、remove(tree, key) は内部インターフェースです。

remove(tree, key) の機能は、ストレッチ ツリー内のキー値が key のノードを削除することです。

まず、スプレー ツリー内でキー key を持つノードを検索します。見つからない場合は直接戻ります。見つかった場合は、ノードを回転させてルート ノードにしてから、ノードを削除します。

スプレーツリー実装の完全なコード

  1. パブリッククラスSplayTree<TはComparable<T>>を拡張します{
  2. private SplayTreeNode<T> mRoot; // ルートノード
  3.  
  4. パブリッククラスSplayTreeNode<TはComparable<T>>を拡張します{
  5. T key ; // キーワード (キー値)
  6. SplayTreeNode<T> left ; // 左の子
  7. SplayTreeNode<T> right ; // 右の子
  8.  
  9. パブリックSplayTreeNode() {
  10. this.left = null ;
  11. this.right = null ;
  12. }
  13.  
  14. パブリックSplayTreeNode(Tキー、SplayTreeNode<T>、SplayTreeNode<T>) {
  15. this.key =キー;
  16. this.left =;
  17. this.right =;
  18. }
  19. }
  20.  
  21. /*
  22. *キーに対応するノードをルートノードになるように回転し、ルートノードを返します。
  23. *
  24. * 知らせ:
  25. * (a): スプレーツリーに「キー値がキーであるノード」が存在します
  26. *キー値が key のノードを回転してルート ノードにします。
  27. * (b): スプレーツリーには「キー値がキーであるノード」が存在せず key < tree.keyです
  28. * b-1 「キー値がキーであるノード」の前身ノードが存在する場合、 「キー値がキーであるノード」の前身ノードをルートノードに回転します。
  29. * b-2 「キー値がキーであるノード」の先行ノードが存在する場合、そのキーはツリー内のどのキー値よりも小さいことを意味します。この場合、最小のノードがルートノードになるように回転します。
  30. * (c): スプレー ツリーには「キー値が key のノード」が存在せず key > tree. key です
  31. * c-1 「キー値がキーであるノード」の後継ノードが存在する場合、 「キー値がキーであるノード」の後継ノードをルートノードになるように回転します。
  32. * c-2 「キー値がキーであるノード」の後継ノードが存在しない場合は、そのキーがツリー内のどのキー値よりも大きいことを意味します。この場合、最大のノードがルートノードになるように回転します。
  33. */
  34. プライベートSplayTreeNode<T> splay(SplayTreeNode<T> ツリー、Tキー) {
  35. ツリーがnull場合
  36. ツリーを返します
  37.  
  38. SplayTreeNode<T> N = 新しい SplayTreeNode<T>();
  39. スプレイツリーノード<T> l = N;
  40. スプレイツリーノード r = N;
  41. スプレイツリーノード c;
  42.  
  43. のために(; ; ) {
  44. int cmp = key .compareTo(tree.key ) ;
  45. (cmp < 0) の場合 {
  46. もし(キー.compareTo(tree.left .key ) < 0) {
  47. c = tree.left ; /*右に回転*/
  48. ツリーの左端c.rightにします
  49. c.right = 木;
  50. ツリー = c;
  51. ツリーの左端null場合
  52. 壊す;
  53. }
  54. r.left = tree; /*右にリンク*/
  55. r = 木;
  56. ツリー = tree.left ;
  57. }そうでない場合 (cmp > 0) {
  58.  
  59. もしtree.rightnullならば
  60. 壊す;
  61.  
  62. if ( key .compareTo(tree.right.key ) > 0) {
  63. c = tree.right ; /*左に回転*/
  64. ツリーの右端をc.left にします
  65. c.left = 木;
  66. ツリー = c;
  67. もしtree.rightnullならば
  68. 壊す;
  69. }
  70.  
  71. l.right = tree; /*左にリンク*/
  72. l = 木;
  73. ツリー = tree.right ;
  74. }それ以外{
  75. 壊す;
  76. }
  77. }
  78. l.right = tree.left ; /* アセンブル */
  79. r.left = tree.right ;
  80. ツリーの左端N.rightにします
  81. ツリーの右端をN.leftにします
  82.  
  83. ツリーを返します
  84. }
  85.  
  86. パブリックvoid splay(Tキー) {
  87. mRoot = splay(mRoot、キー);
  88. }
  89.  
  90.  
  91.  
  92. /**
  93. * ノードをスプレーツリーに挿入し、ルートノードを返します
  94. * @param tree 拡張ツリーのルートノード
  95. * @param z 挿入されたノード
  96. * @戻る 
  97. */
  98. プライベートSplayTreeNode<T>挿入(SplayTreeNode<T>ツリー、SplayTreeNode<T>z){
  99. int のCMP;
  100. SplayTreeNode<T> y = null ;
  101. ツリーノードを再生します。
  102.  
  103. // zの挿入位置を見つける
  104. (x != null ) の場合 {
  105. y = x;
  106. cmp = z.key.compareTo ( x.key ) ;
  107. (cmp < 0)の場合
  108. x = x.left ;
  109. そうでない場合 (cmp > 0)
  110. x = x.right ;
  111. それ以外{
  112. System.out.printf ( "同じノード(%d)を挿入することはできません!\n" z.key );
  113. ;
  114. ツリーを返します
  115. }
  116. }
  117.  
  118. y == null の場合
  119. ツリー = z;
  120. それ以外{
  121. cmp = z.key.compareTo ( y.key ) ;
  122. (cmp < 0)の場合
  123. y 左= z;
  124. それ以外 
  125. y 右= z;
  126. }
  127.  
  128. ツリーを返します
  129. }
  130.  
  131. パブリックボイド挿入(Tキー){
  132. SplayTreeNode<T> z = 新しい SplayTreeNode<T>(キー null null );
  133.  
  134. // 新しいノードの作成に失敗した場合は戻ります。
  135. ((z = new SplayTreeNode<T>( key , null , null )) == null )の場合
  136. 戻る;
  137.  
  138. // ノードを挿入
  139. mRoot =挿入(mRoot, z);
  140. // ノード (キー) をルートノードに回転します
  141. mRoot = splay(mRoot、キー);
  142. }
  143.  
  144. /*
  145. * ノード(z)を削除し、削除されたノードを返す
  146. *
  147. * パラメータの説明:
  148. * bst ストレッチ ツリー
  149. * z 削除されたノード
  150. */
  151.  
  152. /**
  153. *
  154. * @param ツリー拡張ツリー
  155. * @param key削除するノード
  156. * @戻る 
  157. */
  158. プライベートSplayTreeNode<T>削除(SplayTreeNode<T>ツリー、Tキー){
  159. スプレイツリーノード x;
  160.  
  161. ツリーがnull場合
  162. 戻る ヌル;
  163.  
  164. //キー値 key を持つノードを検索し、見つからない場合は直接返します。
  165. if (search(tree, key ) == null )
  166. ツリーを返します
  167.  
  168. //キーに対応するノードを回転してルート ノードにします。
  169. ツリー = splay(ツリー、キー);
  170.  
  171. ツリーの左null場合
  172. // 「ツリーの先行ノード」をルートノードに回転します
  173. x = splay( tree.left key );
  174. // ツリーノードを削除する
  175. ツリーの右端カーソルを移動します
  176. }
  177. それ以外 
  178. x =ツリーの右;
  179.  
  180. ツリー = null ;
  181.  
  182. xを返します
  183. }
  184.  
  185. パブリックvoid 削除(Tキー) {
  186. mRoot = 削除(mRoot、キー);
  187. }
  188.  
  189. /*
  190. * (再帰的実装) 「ストレッチツリーx」キー値keyを持つノードを検索します
  191. */
  192. プライベートSplayTreeNode<T>検索(SplayTreeNode<T> x、Tキー) {
  193. (x == null )の場合
  194. xを返します
  195.  
  196. int cmp =キー.compareTo ( x.key );
  197. (cmp < 0)の場合
  198. search(x.left , key )を返します
  199. そうでない場合 (cmp > 0)
  200. search ( x.right key )を返します
  201. それ以外 
  202. xを返します
  203. }
  204.  
  205. パブリックSplayTreeNode<T>検索(Tキー){
  206. search(mRoot, key )を返します
  207. }
  208.  
  209. /*
  210. * 最小ノードを見つける: ツリーをルート ノードとして拡張ツリーの最小ノードを返します。
  211. */
  212. プライベートSplayTreeNode<T>最小(SplayTreeNode<T>ツリー) {
  213. ツリーがnull場合
  214. 戻る ヌル;
  215.  
  216. while( tree.left != null )
  217. ツリー = tree.left ;
  218. ツリーを返します
  219. }
  220.  
  221. パブリックT最小値(){
  222. SplayTreeNode<T> p = 最小値(mRoot);
  223. (p != null )の場合
  224. p.keyを返します
  225.  
  226. 戻る ヌル;
  227. }
  228.  
  229. /*
  230. * 最大ノードを見つける: ツリーをルート ノードとして拡張ツリーの最大ノードを返します。
  231. */
  232. プライベートSplayTreeNode<T>最大(SplayTreeNode<T>ツリー) {
  233. ツリーがnull場合
  234. 戻る ヌル;
  235.  
  236. while( tree.right != null )
  237. ツリー = tree.right ;
  238. ツリーを返します
  239. }
  240.  
  241. パブリックT最大値(){
  242. SplayTreeNode<T> p = 最大値(mRoot);
  243. (p != null )の場合
  244. p.keyを返します
  245.  
  246. 戻る ヌル;
  247. }

<<:  初心者からビッグデータ人工知能の専門家になるまでの学習プロセス

>>:  ランダム フォレスト分類アルゴリズムを使用して Iris データ分類をトレーニングするとどうなるでしょうか?

ブログ    
ブログ    

推薦する

...

人工知能の過去と現在を1つの記事で理解する(おすすめコレクション)

はじめに:人工知能の開発プロセスは、多くの紆余曲折を伴う、3 つの上昇と 2 つの下降として説明でき...

Karpathy の新しいビデオが再び人気に: GPT Tokenizer をゼロから構築

技術の第一人者カパシー氏がOpenAIを去った後、彼のビジネスは非常に活発になっています。新しいプロ...

...

...

Open Interpreterは、大規模な言語モデルのコードをローカルで実行できるようにするオープンソースツールです。

最近、Github を閲覧していたところ、Open Interpreter という魔法のツールを見つ...

...

Baidu Brainは、顔をスキャンしてWeChat Momentsで拡散できるAIベースの春節連句をサポート

大晦日、家族が集まる夜。 1月28日、オンライン春節祝賀会(略称オンライン春節祝賀会)が予定通り開催...

...

...

自動運転:距離推定にステレオビジョンをどのように活用するのか?

自動化システムでは、ディープラーニングとコンピュータービジョンが広く普及し、あらゆる場所で利用されて...

...

中国と米国の間で技術冷戦が勃発するだろうか?人工知能は「引き金」

現在、米国は人工知能分野で世界をリードしているが、中国も急速に追い上げており、中国がその主導的能力を...

人工知能業界が「再始動」:2021年の5つの主要トレンドに関する洞察

2020年12月30日、テンセントYoutuの2020年度年次コミュニケーション会議が海南省で正式に...

...