返回数据呈现的重新排序范围的算法

时间:2017-02-14 19:35:19

标签: python algorithm rendering

以下是示例:

given: 1,2,3   [list or range of numbers]
return: 2,1,3  [reordered list]

given: 1,2,3,4,5
return: 3 1 5 2 4 

given: 1,2,3,4,5,6,7
return: 4 1 7 2 6 3 5 OR 4 7 1 5 3 2 6 or similar

given: 1,2,4,5,6,7,8,9
return: 5,1,9,3,7,2,8,4,6 or similar

在渲染中,从中心开始,然后是最极端的情况,并变得越来越详细。这不是随机的。我在python中,但是必须在comp sci中成为这个名字。帮助赞赏。

编辑以添加

甚至案例 -

given: 1234 
return: 2,1,4,3 OR 3,1,4,2 OR 2,4,1,3 OR 3,4,1,2

3 个答案:

答案 0 :(得分:1)

一个有效的,虽然不合适的解决方案:

def sigorder(lst):
    result = []
    l = len(lst)
    if l <= 2:
        return lst
    if l > 2:
        result.append(lst[l/2])
        result.append(lst[0])
        result.append(lst[-1])
        right = sigord(lst[l/2+1:-1])
        left = sigord(lst[1:l/2])
        result.extend(slicezip(left, right))

    return result

内在的,递归函数:

def sigord(lst):
    result = []
    if len(lst) < 3:
        return lst
    else:
        l = len(lst)
        result.append(lst[l/2])
        left = sigord(lst[0:l/2])
        right = sigord(lst[l/2 + 1:len(lst)])
    result.extend(slicezip(left, right))
    return result

slicezip()(注意:方便地自动处理左/右列表的潜在不均匀性)

def slicezip(a, b):
    result = [0]*(len(a)+len(b))
    result[::2] = a
    result[1::2] = b
    return result

列表长度4-9的输出:

[3, 1, 4, 2]
[3, 1, 5, 2, 4]
[4, 1, 6, 2, 5, 3]
[4, 1, 7, 2, 5, 3, 6]
[5, 1, 8, 3, 6, 2, 7, 4]
[5, 1, 9, 3, 7, 2, 6, 4, 8]

答案 1 :(得分:0)

这应该这样做:

def extreme_cases(upd_itrr, new_itrr):
    new_itrr.append(min(upd_itrr))
    new_itrr.append(max(upd_itrr))
    upd_itrr.remove(min(upd_itrr))
    upd_itrr.remove(max(upd_itrr))
    if len(upd_itrr) >= 2:
        extreme_cases(upd_itrr, new_itrr)
    return upd_itrr, new_itrr


def reordered_range(itr):
    new_itr = []
    center = 0
    if len(itr) % 2 != 0:
        center = itr[len(itr) // 2]
    elif len(itr) % 2 == 0:
        center = itr[(len(itr) // 2) - 1]
    new_itr.append(center)
    upd_itr = itr[:]
    upd_itr.remove(center)
    upd_itr, new_itr = extreme_cases(upd_itr, new_itr)
    if upd_itr:
        new_itr.append(upd_itr[0])
    return new_itr


print(reordered_range([1, 2, 3]))
print(reordered_range([1, 2, 3, 4]))
print(reordered_range([1, 2, 3, 4, 5]))
print(reordered_range([1, 2, 3, 4, 5, 6, 7]))
print(reordered_range([1, 2, 4, 5, 6, 7, 8, 9]))

输出:

[2, 1, 3]
[2, 1, 4, 3]
[3, 1, 5, 2, 4]
[4, 1, 7, 2, 6, 3, 5]
[5, 1, 9, 2, 8, 4, 7, 6]

答案 2 :(得分:0)

另一种解决方案:

import numpy as np
from copy import copy

def bisecting_order(lst):

    # bisecting order of an unordered list
    result = []
    l = len(lst)
    if l < 3:
        return lst
    result.append(closest(lst,np.mean(lst)))
    result.append(min(lst))
    result.append(max(lst))

    # get bisections
    while len(result)!=len(lst):
        temp_list = copy(result)
        temp_list.sort()
        for i in xrange(len(temp_list)-1):
            newnum = closest(lst,np.mean([temp_list[i],temp_list[i+1]]))
            if newnum in result:
                continue
            else:
                result.append(newnum)
    return result

def closest(mylist,mynum):
    return min(mylist, key=lambda x:abs(x-mynum))