用于确定列表中不频繁的值的有效算法

Ran*_*ing 4 python algorithm list frequency

我正在构建一个测验应用程序,从一组问题中随机提出问题.但是,要求问题池仅限于用户尚未看到的问题.但是,如果用户已经看到所有问题,那么算法应该"重置"并且仅显示用户曾经看过的问题.也就是说,总是向用户展示他们从未见过的问题,或者如果他们已经看过所有这些问题,那么在展示他们经常看到的问题之前,总是向他们展示他们不太经常看到的问题.

列表(L)以如下方式创建:列表(I)中的任何值可以存在一次或在列表中重复多次.让我们在列表中定义另一个值J,使得它与I的值不同.然后0 <= abs(frequency(I) - frequency(J)) <= 1将始终为真.

换句话说:如果一个值在列表中重复5次,并且5次是列表中任何值重复的最大次数,则列表中的所有值将重复4或5次.该算法应在返回任何值frequency == 4之前返回列表中的所有值frequency == 5.

对不起,这是如此冗长,我正在努力简洁地定义这个问题.请随时留下有问题的评论,如果需要,我将进一步提供资格.

提前感谢您提供的任何帮助.

澄清

谢谢你到目前为止提出的答案.我认为它们中没有任何一个存在.让我进一步解释一下.

我没有与用户交互并向他们提问.我将问题ID分配给考试记录,以便在用户开始考试时,确定他们可以访问的问题列表.因此,我有两个数据结构可供使用:

  • 用户有权访问的可能问题ID列表
  • 此用户之前已分配的所有问题ID的列表.这是上面描述的列表L.

因此,除非我弄错了,否则该问题的算法/解决方案将需要使用上述两个列表来涉及列表和/或基于集合的操作.

结果将是我可以与考试记录关联的问题ID列表,然后插入到数据库中.

cph*_*wis 7

用填充伪代码重写数据库内容.

如果我正确地理解了这个问题,我会把问题(或者他们的ID作为代理人)当作一张实物卡片对待:对于每个用户,将套牌洗牌并一次处理一个问题; 如果他们想要的不仅仅是len(deck)问题,那就重新开始吧:将牌组改成新的顺序并再次进行.当n第一次看到问题时,所有其他问题都会被看到n或被看到n-1.

为了跟踪用户可用的问题,我们将未使用的问题ID放回数据库中,并在需要新交易时递增"通过"计数器的次数.

就像是:

from random import shuffle

def deal():
    question_IDs = get_all_questions(dbconn) # all questions
    shuffle(question_IDs)
    increment_deal_count(dbconn, userID) # how often this student has gotten questions
    return question_IDs


count_deals = get_stored_deals(dbconn, userID) # specific to this user
if count_deals: 
    question_IDs = get_stored_questions(dbconn, userID) # questions stored for this user 
else: # If 0 or missing, this is the first time for this student
    question_IDs = deal()


while need_another_question(): #based on exam requirements
    try:
        id = question_IDs.pop()
    except IndexError:
        question_IDs = deal()
        id = question_IDs.pop() # Trouble if db is ever empty. 

    use_question(id) # query db with the ID, then put question in print, CMS, whatever

# When we leave that while loop, we have used at least some of the questions
# question_IDs lists the *unused* ones for this deal
# and we know how many times we've dealt.

store_in_db(dbconn, userinfo, question_IDs)
# If you want to know how many times a question has been available, it's
# count_deals - (ID in question_IDs)
# because True evaluates to 1 if you try to subtract it from an integer. 
Run Code Online (Sandbox Code Playgroud)


ars*_*jii 5

为什么不有两个列表,一个用于尚未挑选的问题,另一个用于已挑选的问题.最初,尚未挑选的列表将被填满,您将从中挑选元素,这些元素将被删除并添加到选定列表中.一旦尚未挑选的列表为空,重复上述相同的过程,这次使用完整选择的列表作为尚未挑选的列表,反之亦然.