【问题标题】:How to program my own arrays and lists如何编写我自己的数组和列表
【发布时间】:2011-12-30 17:07:12
【问题描述】:

我必须编写几种不同类型的二叉树。但是,我不允许使用诸如数组或集合之类的实用程序。如果有需要,建议构建我自己的数组。问题是,我什至不知道从哪里开始。比如说,我如何构建一个二维数组?

【问题讨论】:

  • 你自己的数组...你是什么意思?在Java中重新编程内存的连续分配? :)
  • 如果你不知道从哪里开始,在重新阅读你的讲义和课程教科书后,你可能应该和你的教授谈谈,以更好地理解作业。如果你能想出一些的方法开始,更新你的问题,你可能会得到帮助。
  • +1。这是一个寻求帮助的学生。我认为这是一个有效的问题。我为 @vedran 不为他找人做这项工作而鼓掌。
  • +1 为homework 标签:)
  • @DJClayworth 当然,但这仍然是一个有用的练习,可以用任何语言进行,并且绝对适合本科工作。

标签: java arrays collections


【解决方案1】:

您必须通过创建对象手动创建链接列表或树,每个对象都包含指向列表或树中下一个对象的指针。这是我在学校时在数据结构课上多次做过的练习。了解如何通过插入和删除来保持列表或树的完整性是一个有用的练习。

公共类 ListNode { 私有 T 有效载荷; 私有 ListNode nextNode; } 公共类 TreeNode { 私有 T 有效载荷; 私有 TreeNode leftChild, rightChild; }

【讨论】:

  • 不,我们不能,我们也不能使用 LinkedList
  • 请注意,我并不是建议您使用LinkedList 类,而是实现您自己的链表。
  • @vedran 专门询问了如何构建 2D 列表,基本上只是列表的列表。我更新了我的答案以合并树或列表。概念基本相同。
【解决方案2】:

构建树不需要数组。有几本关于算法和数据结构的书,如果你在维基百科上找不到你需要的:

http://en.wikipedia.org/wiki/Binary_tree

http://en.wikipedia.org/wiki/List_of_data_structures

(对问题的回答:对于二维数组,创建一个一维数组,并将一维数组存储在一维数组中。可以通过创建自己的链表实现来模拟内置数组。但这既不是有效的,也不是你的老师有心。)

( 实际问题的灵感,你不知道你是 问:

这样的东西是二分搜索的核心数据结构 树...

class Node {
     Object value;
     Node left;
     Node right;
} )

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      编辑:好的,每个人都提到了列表,但我们不要忘记,您也可以在数组上实现二叉树,就像实现堆一样。所以我们有类似的东西:

      public class BinaryTree {
          private int[] tree; // assuming each node holds an integer.
          private int nodeCount;
      
          public BinaryTree (int nodes) {
               tree = new int[nodes * 2];
               nodeCount = nodes;
          }
      
          public int getRoot() {
               return tree[0];
          }
      
          private int getPositionOfNode(int value) {
               for(int i = 0; i < nodeCount; i++) {
                   if(tree[i] == value) {
                       return i;
                   }
               }
               return -1;
          }
      
          public int getLeftChildOfNode(int node) {
               int pos = getPositionOfNode(node);
               if(pos != -1) {
                    return tree[pos * 2];
               }
               return pos;
          }
      
          public int getRightChildOfNode(int node) {
               int pos = getPositionOfNode(node);
               if(pos != -1) {
                    return tree[pos * 2 + 1];
               }
               return pos;
          }
      
          public int getParentOfNode(int node) {
               int pos = getPositionOfNode(node);
               if(pos != -1) {
                    return tree[pos / 2];
               }
               return pos;
          }
      }
      

      在这个结构中,如果一个节点在位置 i,它的子节点将在位置 2*i 和 2*i+1。

      【讨论】:

      • 这对我来说有点太复杂了,但是如果我没有找到更好的解决方案,我会尝试一下。
      • 你能不能使用原始(经典)数组?您在对我的回答的评论中提到您无法使用它们,但您似乎在这里表明可以。
      【解决方案5】:
      public class TwoDArray {
         private Object[] values;
         public TwoDArray(int n, int m) {
             values = new Object[n * m];
         }
         public void set(int i, int j, Object x) { ... }
         public Object get(int i, int j) { ... }
      }
      public class BinTree {
         private BinTree left;
         private BinTree right;
         private Comparable value;
         public void insert(Comparable x) { ... }
      }
      

      这样的? 应该没那么难。

      【讨论】:

        【解决方案6】:

        我首先假设您甚至被禁止使用 Java 的原始数组类型。在这种情况下,您将不得不回到最基本的内容并开始自己管理内存。您需要首先分配一个适当大小的字节数组或 ByteBuffer。然后将使用 C 中直接的指针数学来处理对该数据块的访问。

        16 个整数的一维数组示例:

        byte[] mem = new byte[16 * 4] ; // Ints are 4 bytes long
        
        // Write a value to the 8th element of our "array"
        index = 8 ;
        int value = 31415926 ;
        mem[4 * index + 0] = (byte)( value >> 24 ) ;
        mem[4 * index + 1] = (byte)( ( value << 8 ) >> 24 ) ;
        mem[4 * index + 2] = (byte)( ( value << 16 ) >> 24 ) ;
        mem[4 * index + 3] = (byte)( ( value << 24 ) >> 24 ) ;
        

        读取一个值将通过反转过程并计算存储的 int 值来完成。

        注意:设置和检索值的过程使用 ByteBuffer 更容易,因为它是获取原始 Java 类型并将其放入字节数组的方法。

        【讨论】:

          猜你喜欢
          • 2023-03-28
          • 1970-01-01
          • 2013-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-16
          • 2013-02-04
          相关资源
          最近更新 更多