2017-04-13 121 views
0

问题减少时间复杂度

我想在火力5个随机节点,其中值“状态”等于“ACEPTED”,这两种解决方案我已经实现需要大量的时间

解决方案1:

该解决方案由获得随机值的,如果他们的“状态”等于“ACEPTED”将其添加到我的清单。

private DatabaseReference mdatabas; 
private List<String> keys;  

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_makequestions); 

    keys=new ArrayList<>(); 

    mdatabas=FirebaseDatabase.getInstance().getReference() 
    .child("QUESTIONS").child("SPANISH"); 

    getNofQuestions(); 
} 

private void getNofQuestions(){ 
    mdatabas.child("QUESTIONID").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      //QUESTION ID IS EQUAL TO THE NUMBER OF QUESTIONS 
      nOfQuestions=dataSnapshot.getValue(Integer.class); 
      getRandom(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

private void getRandom(){ 
    getQuestion(random.nextInt(nOfQuestions-11)+11); 
} 

private void getQuestion(int random){ 
    mdatabas.child(String.valueOf(random)).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if(keys.size()==4){ 
       Toast.makeText(getApplicationContext(),"FINISHED",Toast.LENGTH_SHORT).show(); 
      } 
      else{ 

      if(dataSnapshot.child("STATE").getValue(String.class)!=null){ 
       if(dataSnapshot.child("STATE").getValue(String.class).equals("ACEPTED")){ 
        keys.add(dataSnapshot.getKey()); 
        getRandom(); 
       } 
       else{ 
        getRandom(); 
       } 
      } 
       else{ 
       getRandom(); 
      } 

      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

解决方案2 基本上我得到所有他们的状态值等于接受了问题,洗牌他们,使子列表。

private void getQuestions(){ 

    mdatabas.orderByChild("STATE").equalTo("ACEPTED").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snapshot:dataSnapshot.getChildren()){ 
       keys.add(snapshot.child("ID").getValue(String.class)); 
      } 
      Collections.shuffle(keys); 
      List<String> finalKeys = keys.subList(0, 4); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

} 

JSON结构(这是下面的问题/西班牙)

{ 
"0" : { 
"ID" : "0", 
"MISPELLED" : 1, 
"SPAM" : 1, 
"STATE" : "ACEPTED", 
"WRONGLANGUAGE" : 1, 
"WRONGREGION" : 1 
}, 
"1" : { 
"ID" : "1", 
"OPTION1" : "Elementos químicos ", 
"OPTION2" : "Huesos ", 
"OPTION3" : "Órganos ", 
"OPTION4" : "Células ", 
"QUESTION" : "La estequiologia se encarga de estudiar " 
}, 
"2" : { 
"CORRECT" : 1, 
"ID" : "11", 
"LIKES" : 15, 
"OPTION1" : "Elementos químicos ", 
"OPTION2" : "Huesos ", 
"OPTION3" : "Órganos ", 
"OPTION4" : "Células ", 
"QUESTION" : "La estequiologia se encarga de estudiar ", 
"STATE" : "ACEPTED", 
"WRONG" : 1 
}, 
"3" : { 
"CORRECT" : 2, 
"ID" : "12", 
"LIKES" : 6, 
"MISPELLED" : 2, 
"OPTION1" : "Ingestión de cecaria enquistada en \r\nplanta de agua dulce.\r\n ", 
"OPTION2" : "Ingestión de metacecaria enquistada en \r\nplanta de agua dulce.\r\n", 
"OPTION3" : "Ingestión de metacecaria enquistada en \r\nplanta de agua salada", 
"OPTION4" : "Ingestión de esporocito enquistada en \r\nplanta de agua dulce.\r\n", 
"QUESTION" : "Mecanismos de transmisión de faciolopsis buski ", 
"WRONG" : 3 
}, 
"QUESTIONID" : 3 
} 

所以我我的问题是,如果有一些获取数据或任何改进的另一种方式,我可以使地雷减少时间复杂性?

回答

0

正如很多NoSQL数据库中常见的那样,为您的用例建立数据模型。既然您正在寻找一个已被接受的随机问题,请保留一份所需的最基本信息清单。

acceptedQuestionIds 
    <questionId>: true 

使用该结构,您可以加载接受的问题ID列表并随机选择一个,这应该快得多。

一些评论:

+0

感谢,关于它使用随机的númerical索引,我现在将移动到推送ID。 –