区间模糊排序,给出对应点集,并统计对应点所落在的区间的次数

来源:互联网 发布:新会人民法院 淘宝拍卖 编辑:程序博客网 时间:2024/06/05 02:38
过程是
先对区间和点进行混合排序例如[a1,b1][a2,b2],[a3,b3],[a4,b4],[a5,b5]和点集[c1,c2,c3]
结果为[a1,a2,c1,a3,c2,b1,a4,b2,b3,c3,a5,b4,b5]
在排序的时候同时创建一个用于标记起始点结束点和点的列表
对结果中的每个c进行次数统计
程序中排序使用快速排序
import sysimport randomdef less_than_or_equal(num1, num2, let1, let2):    return less_than(num1, num2, let1, let2) or \    equal(num1, num2, let1, let2)def less_than(num1, num2, let1, let2):    return num1 < num2 or \            (num1 == num2 and let1 < let2)def equal(num1, num2, let1, let2):    return num1 == num2 and let1 == let2def fast_count_segments(starts, ends, points):    cnt = [0] * len(points)    LEFT = 1#起始点为1,终止点为3,点为2,符合上面用于比较的函数:当起点终点和点相等是能达到排序为如下的效果[起点,点,终点]    POINT = 2    RIGHT = 3    starts_l = [LEFT] * len(starts)    ends_r = [RIGHT] * len(ends)        points_p = [POINT] * len(points)    pairs_number = starts + ends + points#排序列表    pairs_letter = starts_l + ends_r + points_p#标记列表    randomized_quick_sort(pairs_number, pairs_letter, 0, len(pairs_number) - 1)    count_left = 0    point_counts = {}    for p in points:        point_counts[p] = 0    for i in range(len(pairs_number)):#当指针指向一次起点,+1,指向一次终点,-1,指向一次点,记录此时的count_left到dict中        if pairs_letter[i] == LEFT:            count_left += 1        elif pairs_letter[i] == RIGHT:            count_left -= 1        elif pairs_letter[i] == POINT:            if point_counts[pairs_number[i]] == 0:                point_counts[pairs_number[i]] += count_left    for i in range(len(points)):        cnt[i] = point_counts[points[i]]    return cntdef partition3(a, b, l, r):    x = a[l]    letx = b[l]    begin = l+1    end = l    for i in range(l + 1, r + 1):        if less_than_or_equal(a[i], x, b[i], letx):            end += 1            a[i], a[end] = a[end], a[i]            b[i], b[end] = b[end], b[i]            if less_than(a[end], x, b[end], letx):                a[begin], a[end] = a[end], a[begin]                b[begin], b[end] = b[end], b[begin]                begin += 1                    a[l], a[begin-1] = a[begin-1], a[l]    b[l], b[begin-1] = b[begin-1], b[l]    return [begin, end]def randomized_quick_sort(a, b, l, r):    if l >= r:        return    k = random.randint(l, r)    a[l], a[k] = a[k], a[l]    b[l], b[k] = b[k], b[l]    #use partition3    [m1, m2] = partition3(a, b, l, r)    randomized_quick_sort(a, b, l, m1 - 1);    randomized_quick_sort(a, b, m2 + 1, r);if __name__ == '__main__':    input = sys.stdin.read()    data = list(map(int, input.split()))    n = data[0]    m = data[1]    starts = data[2:2 * n + 2:2]    ends   = data[3:2 * n + 2:2]    points = data[2 * n + 2:]    #use fast_count_segments    cnt = fast_count_segments(starts, ends, points)    for x in cnt:        print(x, end=' ')

0 0
原创粉丝点击